I wanted to add a secondary backup destination to an Hyper-V hypervisor. The backup destination had to be an USB disk. In fact, the need was to have a secondary backup which could be usable in case of ransomware attack (to face the case where our main backup destination has been crypted). We will do a backup to two differents USB disks : when the first one is connected, the second will not. Veeam Backup & Replication Free was a good choice, because it's a good backup software, it's free, and we can script it with PowerShell.
########################### # author : shebangthedolphins.net # version : 1.0 # date : 2019.02 # role : veeam backup to a USB disk and send an e-mail report # other : # - Need to install Veeam Backup Replication Free # - Tested on a Windows 2012R2 Standard, with Hyper-V role and Veeam Backup & Replication Free 9.5 Update 4 # - USB disk are set to be mounted with F:\ letter # updates : # - 1.0 : first version, simple one #Import veeam PowerShell snap-ins to the current session Add-PSSnapin veeamPSSnapin #Set Variables $HVname = "HYPER-V" $VMs = Get-Vm | select -ExpandProperty Name #Put every VM names into $VMs variable $Error = 0 #set $Error flag $encoding = [System.Text.Encoding]::UTF8 $array = @() $Body = "" foreach ($VM in $VMs) { $HVObject = Find-VBRHvEntity -Server $HVname -Name $VM $Result = Start-VBRZip -Folder "F:\VEEAM" -Entity $HVObject -AutoDelete Tonight -Compression 5 | select -ExpandProperty Result #do "Get-Help Start-VBRZip -detailed" to know more if ([string]$Result -ne 'Success' -or -not ($?)) { $Error = 1 #we set Error flag to 1 $Result = "Error" } $array += @{ Vm = $VM; Result = $Result } } foreach($value in $array) #We set our e-mail body { $Body += "VM Backup " + $value.Vm + " ended with : " + $value.Result + "result`n" } #email backup report if ($Error -eq "0") { Send-MailMessage -To veeam-usb-backup@shebangthedolphins.net -Subject "Veeam USB Backup - OK" -From backup-usb@shebangthedolphins.net -smtpserver smtp.shebangthedolphins.net -Body $Body -Encoding $encoding #send email } else { Send-MailMessage -To veeam-usb-backup@shebangthedolphins.net -Subject "Veeam USB Backup - KO" -From backup-usb@shebangthedolphins.net -smtpserver smtp.shebangthedolphins.net -Body $Body -Encoding $encoding #send email }
########################### # author : shebangthedolphins.net # version : 2.0 # date : 2019.03 # role : veeam backup to a USB disk and send an e-mail report # other : # - Need to install Veeam Backup Replication Free # - Tested on a Windows 2012R2 Standard, with Hyper-V role and Veeam Backup & Replication Free 9.5 Update 4 # - USB disk are set to be mounted with F:\ letter # updates : # - 2.0 : if a backup fails, try again until 5 times. Automaticaly delete backups which have failed. #Import veeam PowerShell snap-ins to the current session Add-PSSnapin veeamPSSnapin #Set Variables $VMs = Get-Vm | select -ExpandProperty Name #Put every VM names into $VMs variable $HVname = "HYPER-V" $Error = 0 #set $Error flag $encoding = [System.Text.Encoding]::UTF8 $array = @() $array_VMs_Error = @() $Body = "" $i = 0 foreach ($VM in $VMs) { $HVObject = Find-VBRHvEntity -Server $HVname -Name $VM $Result = Start-VBRZip -Folder "F:\VEEAM" -Entity $HVObject -AutoDelete TomorrowNight -Compression 5 | select -ExpandProperty Result #do "Get-Help Start-VBRZip -detailed" to know more $ExitCode = $? if ([string]$Result -ne 'Success' -or -not ($ExitCode)) { $array_VMs_Error += @{ Vm = $VM } #We log VMs which failed to be saved } else { $array += @{ Vm = $VM; Result = $Result } #We log VMs which success } } foreach($value in $array_VMs_Error) #If VMs has failed we try to backup them again here { $HVObject = Find-VBRHvEntity -Server $HVname -Name $value.Vm $Result = Start-VBRZip -Folder "F:\VEEAM" -Entity $HVObject -AutoDelete TomorrowNight -Compression 5 | select -ExpandProperty Result #do "Get-Help Start-VBRZip -detailed" to know more $ExitCode = $? While (([string]$Result -ne 'Success' -or -not ($ExitCode)) -and $i -lt 5) { #Try to backup again if error but abord it already tried 5 times $i++ $Result = Start-VBRZip -Folder "F:\VEEAM" -Entity $HVObject -AutoDelete TomorrowNight -Compression 5 | select -ExpandProperty Result $ExitCode = $? } if ([string]$Result -ne 'Success' -or -not ($ExitCode)) { #if backup fails after 5 times $Error = 1 #we set Error flag to 1 $Result = "Error" } $array += @{ Vm = $value.Vm; Result = $Result } #We had entry to our array which contains results for all VMs $i = 0 } foreach($value in $array) #We set our e-mail body { $Body += "VM Backup " + $value.Vm + " ended with : " + $value.Result + "result`n" } #Delete backups which have failed (all vbk files on F:\ which are less than 25Mo) : Get-ChildItem F:\ -Recurse -Filter *vbk | Where-Object { $_.Length / 1MB -lt 25 } | Remove-Item -Force #email backup report if ($Error -eq "0") { Send-MailMessage -To veeam-usb-backup@shebangthedolphins.net -Subject "Veeam USB Backup - OK" -From backup-usb@shebangthedolphins.net -smtpserver smtp.shebangthedolphins.net -Body $Body -Encoding $encoding #send email } else { Send-MailMessage -To veeam-usb-backup@shebangthedolphins.net -Subject "Veeam USB Backup - KO" -From backup-usb@shebangthedolphins.net -smtpserver smtp.shebangthedolphins.net -Body $Body -Encoding $encoding #send email }
See here
Contact :