Windows 2008 backup script

clip_image001

Con l’avvento di Vista/Windows2008/Seven tutti noi abbiamo dovuto abbandonare le vecchie abitudini relative al backup per abbracciare una nuova filosofia.
Abbandonato il sempre odiato ma spesso utilizzato NTBackup, ci si è dovuti adattare al Windows Backup di nuova generazione che ci ha riservato, come sgradita sorpresa, la caratteristica di funzionare al pieno delle proprie possibilità solo su dischi collegati direttamente alla macchina da backuppare (!), snobbando completamente le storiche unità nastro e limitando l’utilizzo di share di rete e/o NAS.
Detto che per le unità DAT et simila c’è poco da fare, per i backup su share di rete si può organizzare qualcosa di interessante utilizzando powershell e i cmdlet di WSB.

[more]

Ingredienti

– Un sistema operativo supportante WSB;

– powershell 2.0, preinstallato sulle ultimissime versioni, scaricabile da qui per quelle più vecchie;

Preparazione

Per partire è necessario autorizzare l’esecuzione degli script powershell sulla macchina da backuppare digitando, ad esempio in un prompt dei comandi:

powershell "Set-ExecutionPolicy Unrestricted"

Quindi si procede con l’installazione del servizio per i backup con i relativi cmdlet:

ServerManagerCmd.exe -install Backup –allSubFeatures

Infine lo script powershell che si occupa del backup

####################################################

#  WBBackup.ps1

#  Backup Windows 2008 with WindowsBackup

#  Version 1.0

#  modified: 19/02/2010

#  Autore: Gianluca Ferri

####################################################

# Mapping network share

#(New-Object -ComObject Wscript.Network.MapNetworkDrive)("X:", "\\nas01\Backup", $false, "BackupUser","BackupPassword")

 

# Var

$Customer="Customer"

$DestFolder="\\Nas01\Backup\" # Backup destination

$LogFile="C:\Dati\Logs\Backup\" # Logfile

$LogsFolder="C:\Dati\Logs\Backup\" # Logs archive folder

[Array] $Services="" #"Virtual Machine Management Hyper-V" # Array of services to stop/start

$SMTPServer="SMTP server"

$SMTPServerUser="SMTPUser"

$SMTPServerPass=ConvertTo-SecureString "SMTPPassword" -AsPlainText -Force

 

$MailFrom=$Customer + " Backup <indirizzo mittente>"

$MailTo="indirizzo destinatario"

$MailBcc="indirizzo destinatario"

$Emailsubject="[" + $Customer + "] Report backup " + (get-wmiobject win32_computersystem).name

$DaysOld=15 # Logs retain days

$Culture= New-Object Globalization.CultureInfo "it-IT"

 

$today=Get-Date

$DestFolder=$DestFolder + $today.dayofweek.tostring($Culture)

if (!(Test-Path $DestFolder))

    { 

    # Make folder

    New-Item $DestFolder -type directory

    }

# Stop services

if ($Service.count>0) {foreach ($serv in $Services) {stop-service $serv}}

 

# Start backup

$commandline="wbadmin.exe"

$params={start backup `-backuptarget:$DestFolder `-include:"C:" `-VSSFull -allcritical -quiet}

$LogFile=$LogFile + $Customer + (Get-Date -f yyyyMMdd) + ".log"

$exec = "$commandline $params >$LogFile"

Invoke-Expression $exec

 

# Restart services

if ($Service.count>0) {foreach ($serv in $Services) {start-service $serv}}

 

# Send email report

$Credential=New-Object System.Management.Automation.PSCredential ($SMTPServerUser, $SMTPServerPass)

send-mailmessage -to $MailTo -bcc $MailBcc -from $MailFrom -subject $Emailsubject -Attachments $LogFile -smtpServer $SMTPServer -Credential $Credential

 

# Delete older logs

dir $LogsFolder -recurse | where {!$_.PsIsContainer -AND $_.lastWriteTime -lt (Get-Date).AddDays(-$DaysOld) } | select LastWriteTime,@{n="Path";e={convert-path $_.PSPath}} | Remove-Item -force

Questi i passaggi fondamentali eseguiti dallo script:

  1. ferma i servizi riportati nella variabile $Services;
  2. crea una cartella con il nome del giorno della settimana nel percorso indicato in $DestFolder;
  3. esegue un backup completo (con creazione dell’immagine) del disco C: salvandolo nella cartella $DestFolder\giornodellasettimana;
  4. riavvia i servizi precedentemente arrestati;
  5. invia una mail con allegato il log del backup agli indirizzi indicati in $MailTo e $MailBcc utilizzando il server $SMTPServer;
  6. cancella i file di log più vecchi di $DaysOld.

Per schedularlo è sufficiente riportare, come riga di comando,

powershell.exe -command "& 'percorsodelloscript\WBBackup.ps1'"

Quel che otterrò sarà un backup completo per ogni giorno della settimana, regolarmente sovrascritto la settimana successiva; non è il backup incrementale possibile su un disco collegato direttamente, ma è comunque il massimo ottenibile da WSB.

Conclusioni

Secondo Murphy, il backup è un’operazione che non viene mai eseguita in tempo; compito di ogni amministratore di sistema è convincere Mr. Murphy a prendere una lunghissima vacanza.

clip_image001[6]

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.