DriveSnapshot mit PowerShell – eine Antwort

powershell_logo

Michael Reischl hat mich in einem Beitrag zu DriveSnapshot gefragt, ob ich eine Lösung für sein kleines Problem habe, was die Sicherung mit DriveSnapshot via PowerShell angeht. Dazu sei gesagt: Nachdem ich den ISO-Layer 8 aus dem Weg geräumt hatte, lief das Script schon ganz gut.

Zuerst möchte ich hier – mit sämtlichen Credits zu Michaels Gunsten (er hat das Teil ja schliesslich geschreiben ;)) Michaels Script vorstellen:
[cc lang=’powershell’ ]

#Drivesnapshot Backup Script by Michael Reischl http://www.gamorz.de /-/ Alpha 0.2
#This Script takes Images per Week, in every Week Folder you´ll find one full Image and 6 Differential Images.
#The Hash file is Stored directly on C Drive
#Images Older than 2 Weeks got Deleted in Standard Setting

#Base Informations
$date = Get-Date -Format dddd.d.MM.yyyy #Get the Date in a easy Readable Form.
$time = Get-Date -uFormat %T #Get Time when Backup Starts
$week = get-date -uFormat %V #Get Week Number
$destbackup = “\\path\to\your\backup\folder\$week” #Backup Destination Folder with Week Number
$destbackupmk = “\\path\to\your\backup\folder\” #Backup Folder for creating Week Number Folders and Deleting old Images
$Source = “C:” #Source Drives, more than one? then write “C:+D:+E:”
$Logfile = “\\path\to\your\logfile\destination\image_$date.log” #The place for the Drivesnapshot Log Files
$Log = “–Logfile:” #Enable Logging
$vss = “–usevss” #VSS Options are –novss – don´t use vss: –usevss – use vss if available: –forcevss – use vss, if not available exit with error
$EmailFrom = “image@yourdomain.com” #Summary Email Sender Address
$EmailTo = “admin@yourdomain.com” #Summary Email Receiver
$EmailSubject = “Computername Image Completed” #Summary Email Subject
$SMTPServer = “192.168.0.1” #Mail Server Address
$delold = “1” #Delete Images older than 14 Days, set to “0” if you want to keep it.

#Create the Backup Destination Folder Based on Week Number, if the folder exists go further.
if (!(Test-Path -path $destbackupmk\$week))
{
New-Item $destbackupmk\$week -type directory
}

#Folder Check if its empty, yes = create full image no = create differential image
$check = (Get-Childitem $destbackup | Measure-Object).count

#Take the Image and Store the Hash file on C Drive for Diff backups!
if ($check -le 0)
{
c:\snapshot $source $destbackup\`$Disk_`$Type_`$Date_`$Computername.sna -oc:ihash_`$Disk.hsh $vss $Log$Logfile
}
else
{
c:\snapshot $source $destbackup\`$Disk_`$Type_`$Date_`$Computername.sna -hc:ihash_`$Disk.hsh $vss –LogFile:$Logfile
}

#Create the Email Body related to exit Code Success/Failed
if ($lastexitcode -eq 0)
{
$html = (“<tt>Drivesnapshot Image Completed.<br>” +
“<br>Start time :   ” + [string]$time +
“<br>Source :   ” + “Computername” +
“<br>Destination :  ” + [string]$destbackup +
“`n<pre>”)
}

else
{
$EmailSubject = “Drivesnapshot Image Failed!!”
$html = (“<tt>Drivesnapshot Image Failed. See the Logs for Details<br>” +
“<br>Start time :   ” + [string]$time +
“<br>Source :   ” + “Computername” +
“<br>Destination :  ” + [string]$destbackup +
“`n<pre>”)
}

#New Mail Sending on Powershell v2
Send-MailMessage -From $EmailFrom -To $EmailTo -Subject $EmailSubject -Body $html -BodyAsHtml -Attachments $Logfile -SmtpServer $SMTPServer

#Check if there are Images older than 2 Weeks and Delete it
if ($delold -eq 1) {$Today = Get-Date
Get-Childitem $destbackupmk -recurse | Where-Object {($Today – $_.LastWriteTime).Days -gt 14} | Remove-Item -recurse}

[/cc]

Im oberen Teil wird lediglich die Konfiguration des Scripts vorgenommen. Was an Optionen bei DriveSnapshot nicht erwünscht ist, kann “entwertet” werden. Der Wert der Variable kann also gelöscht werden. Anschliessend wird der Backup-Ordner erstellt, und es wird geprüft, ob bereits ein Backup vorhanden ist. Ist dem so, wird ein Differential-Image gestartet, ansonsten kommt es zum Full-Safe. Je nach Ausgang des Backups verschickt Miachel dann eine E-Mail-Benachrichtigung (die ich bis jetzt noch nicht zum laufen gebracht habe, aber ich nutze auf meinem Testsystem noch PS 1.0)

Nun hat Michael das Problem, dass er nicht weiss, wie er nach einem errorlevel 0 (kein Fehler) noch einen Testlauf anheften kann. Meine Antwort? Keine Ahnung! Aber lass doch jedes Image direkt im Anschluss prüfen. Wenn das Backup nicht erfolgreich ist, wird es nicht zu Ende geschrieben, und kann auch nicht geprüft werden. Wo keine Prüfung, da ein Errorlevel 1 oder höher, also gibt es auch kein Problem mit einer Abfrage.

Dementsprechend, und wegen einiger Kleinigkeiten, die mir nicht so ganz gepasst, bzw. gefallen – oder einfach gefehlt haben, habe ich das Script noch ein wenig erweitert:

[cc lang=’powershell’ ]

#Drivesnapshot Backup Script by Michael Reischl http://www.gamorz.de /-/ Alpha 0.2
#Edited by Manuel Sychold http://blog.sychold.ch
#This Script takes Images per Week, in every Week Folder you´ll find one full Image and 6 Differential Images.
#The Hash file is Stored on a specified Directory
#Images Older than 2 Weeks got Deleted in Standard Setting

#Base Informations
$date = Get-Date -Format dddd.d.MM.yyyy #Get the Date in a easy Readable Form.
$time = Get-Date -uFormat %T #Get Time when Backup Starts
$week = Get-Date -uFormat %V #Get Week Number
$destbackup = “H:\SnapShot\2012\$week” #Backup Destination Folder with Week Number
$destbackupmk = “H:\SnapShot\2012\” #Backup Folder for creating Week Number Folders and Deleting old Images
$desthashfile = “-oH:\SnapShot\Hash\ihash_`$Computername_`$Disk.hsh”
$srchashfile = “-hH:\SnapShot\Hash\ihash_`$Computername_`$Disk.hsh”
$Source = “C:” #Source Drives, more than one? then write “C:+D:+E:”
$test = “-T” #Adds testing of the new image at the end of every backup
$fsize = “-L80000″ #Maximum filesize in MB
$ooptions = “” #Place for other, additional Options you want to add to DriveSnapshot
$Logfile = “H:\SnapShot\Logs\image_$date.log” #The place for the Drivesnapshot Log Files
$Log = “–Logfile:” #Enable Logging
$vss = “–usevss” #VSS Options are –novss – don´t use vss: –usevss – use vss if available: –forcevss – use vss, if not available exit with error
$graphic = “-Gx” #Use Graphic-Mode for a visual process
$EmailFrom = “info@sychold.ch” #Summary Email Sender Address
$EmailTo = “manuel@sychold.ch” #Summary Email Receiver
$EmailSubject = “%hostname% Image Completed” #Summary Email Subject
$SMTPServer = “192.168.2.21” #Mail Server Address
$delold = “1” #Delete Images older than 14 Days, set to 0 if you want to keep it.

#Create the Backup Destination Folder Based on Week Number, if the folder exists go further.
if (!(Test-Path -path $destbackupmk\$week))
{
New-Item $destbackupmk\$week -type directory
}

#Folder Check if its empty, yes = create full image no = create differential image
$check = (Get-Childitem $destbackup | Measure-Object).count

#Take the Image and Store the Hash file on C Drive for Diff backups!
if ($check -le 0)
{
c:\snapshot $source $destbackup\`$DISK_`$Type_`$Date_`$Computername.sna $desthashfile $vss $graphic $test $fsize $ooptions $Log$Logfile
}
else
{
c:\snapshot $source $destbackup\`$Disk_`$Type_`$Date_`$Computername.sna $srchashfile $vss $graphic $test $fsize $ooptions $Log$Logfile
}
#Create the Email Body related to exit Code Success/Failed
if ($lastexitcode -eq 1)
{
$html = (“<tt>Drivesnapshot Image Failed. See the Logs for Details<br>” +
“<br>Start time : &nbsp;&nbsp;” + [string]$time +
“<br>Source : &nbsp;&nbsp;” + “Computername” +
“<br>Destination : &nbsp;” + [string]$destbackup +
“`n<pre>”)
}

else
{
$EmailSubject = “Drivesnapshot Image Completed!!”
$html = (“<tt>Drivesnapshot Image FAILED.<br>” +
“<br>Start time : &nbsp;&nbsp;” + [string]$time +
“<br>Source : &nbsp;&nbsp;” + “Computername” +
“<br>Destination : &nbsp;” + [string]$destbackup +
“`n<pre>”)
}

#New Mail Sending on Powershell v2
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $EmailTo -Subject $EmailSubject -Body $html -BodyAsHtml -Attachments $Logfile

#Check if there are Images older than 2 Weeks and Delete it
if ($delold -eq 1) {$Today = Get-Date
Get-Childitem $destbackupmk -recurse | Where-Object {($Today – $_.LastWriteTime).Days -gt 14} | Remove-Item -recurse}

[/cc]

Im Endeffekt ist das Script noch so, wie am Anfang, nur dass ich einige Optionen (Variablen) hinzugefügt habe, die die Konfiguration des Scripts noch vereinfachen. So kann nun die Hash-File an einem beliebigen Ort abgespeichert werden, die maximale Dateigrösse einer .hsh-File kann festgelegt werden, und es wird automatisch nach dem Backup ein Testlauf ausgeführt. Ausserdem habe ich noch den Gx-Modus, der das GUI anzeigt eingefügt, und einen Platzhalter $ooptions eingefügt, den Ihr nach Herzenslust betanken dürft.

Viel Spass beim testen!

Veröffentlicht von

Manuel Sychold, Citrix Certified Adminitrator for XenServer 6 und XenDesktop 5 arbeitet als CIO in einem international tätigen Akustik-Unternehmen. Manuel bloggt hauptsächlich über Citrix -Produkte (XenServer, XenDesktop, XenApp), sowie Microsoft-Produkte. Manuel erreicht man über Google+

10 Kommentare » Schreibe einen Kommentar

  1. Hi Manuel,

    Danke erstmal für deine Bemühungen!
    Das Hash File abzulegen wo man will hatte bei mir Leider nicht geklappt von dahher hatte ich das kurzerhand auf die System Partition verlegt.
    Werde deine Version im Laufe der Woche Testen.

    Zu deinem Problem mit dem Email Versand habe ich hier aus meinem alten Robocopy Script noch die Passage für PS v1
    [code]
    #Send E-mail message with log file attachment on old PowerShell v1
    #$Message = New-Object Net.Mail.MailMessage($EmailFrom, $EmailTo, $EmailSubject, $Logfile)
    #$Attachment = New-Object Net.Mail.Attachment($Logfile, ‘text/plain’)
    #$Message.Attachments.Add($Attachment)
    #$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $SMTPPort)
    #$SMTPClient.Send($Message)
    [/code]
    Damit funktioniert der Email Versand in der v1 sowie auch unter v2.

    lg
    Michael

    P.S. $ooptions sehr gute Idee!

    • Hi Michael,
      danke für das Snippet!
      Gerell habe ich mir aber überlegt, dass man alles in die $ooptions-Variable stecken könnte, was nicht unbedingt gebraucht wird (alles ausser –vss, und Log:LOGFILE). Habe das in meiner internen Version mal angepasst, und es scheint so weit ganz gut zu funktionieren.
      Werde jetzt nächtlich ein Backup mit dem PowerShell-Script durchlaufen lassen, und schauen wie es sich in 2 Wochen verhält. Soweit ich das gesehen habe, wird dann ja immer nach 14 Tagen das Full-Backup gelöscht, und die alten Dif-Files bleiben erhalten? Das müsste man noch irgendwie umgehen, ich habe es hier mal mit dem Schreibgeschützt-Attribut gelöst. :)

  2. Hi Again,

    Habe das Script gerade nochmal upgedated.
    Der Testlauf wird nun nach erfolgreicher Image erstellung gestartet.
    Die -T option ist zwar weitaus einfacher, aber einfach ist langweilig ;-)

    Dass ich das Hash File nicht zusammen mit auf mein Backup Folder ablegen konnte lag einfach nur daran dass die option zur Angabe wo die Hashes liegen nicht mit UNC Pfade umgehen kann.
    Dadurch habe ich noch eine Sektion eingebaut in der man vorab ein Laufwerk Mounten kann.

    Auf ein gutes Backup!
    lg
    Michael

  3. Zu deiner frage was nach 14 Tagen passiert:
    Bei jedem durchlauf wird geprüft ob Ordner/Dateien im Backup Folder existieren die älter als 14 Tage sind. Wird das Script fündig werden diese komplett gelöscht incl. Ordner.
    Da ich das Intern nur dazu verwende um schnell ein System Restaurieren zu können oder Testsysteme zu generieren reicht mir ein 14tägiger bestand vollkommen.

    Grüsse,
    Michael

    • Okay, dann ist das halt so. Ich schau trotzdem weiterhin nach dem RA-Recht, vielleicht kann man so wenigstens die Fulls aufbewahren – Kann man dann ja bei Bedarf mit robocopy wegkopieren ;)
      Ich schick Dir bei Gelegenheit (morgen, wenns klappt) mal die neue Version zu :)

      Grüsse,
      Manuel

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

This Blog will give regular Commentators DoFollow Status. Implemented from IT Blögg