{"id":514,"date":"2016-09-15T16:27:17","date_gmt":"2016-09-15T15:27:17","guid":{"rendered":"http:\/\/snakenet.eu\/blog\/?p=514"},"modified":"2016-09-15T16:27:17","modified_gmt":"2016-09-15T15:27:17","slug":"automatiser-les-backups-de-ses-vms-avec-veeam-backup-free-edition","status":"publish","type":"post","link":"https:\/\/snakenet.eu\/blog\/automatiser-les-backups-de-ses-vms-avec-veeam-backup-free-edition\/514\/","title":{"rendered":"Automatiser les backups de ses VMs avec VEEAM Backup Free edition"},"content":{"rendered":"<h1>Pr\u00e9-requis :<\/h1>\n<p>Un share r\u00e9seau sur lequel l&rsquo;objet COMPUTER de la machine VEEAM a les droits en \u00e9criture.<br \/>\nLe soft ignore les param\u00e8tres de credentials cr\u00e9\u00e9s pour l&rsquo;occasion, alors, autant s&rsquo;en passer compl\u00e8tement \ud83d\ude42<br \/>\nLe script doit \u00eatre lanc\u00e9 en tant qu&rsquo;administrateur !!<\/p>\n<p>J&rsquo;ai pr\u00e9f\u00e9r\u00e9 cr\u00e9er un script qui fait tout plut\u00f4t que de faire de la config dans l&rsquo;application et dans le script.<\/p>\n<h1>Le script :<\/h1>\n<pre># Author: Vladimir Eremin\r\n# Created Date: 3\/24\/2015\r\n# http:\/\/forums.veeam.com\/member31097.html\r\n#\r\n# Adapted by Myself\r\n# Must be run as administrator !\r\n# backup everything except VMs defined\r\n\r\n##################################################################\r\n#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 User Defined Variables\r\n##################################################################\r\n\r\n$ExceptionVMNames = @('DSVA-VM01','VM-VEEAM-01')\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Theses VMs will NOT be backuped.\r\n$HostName = \"ESXNAME01\"\r\n$Directory = \"\\\\NAS01.DOMAIN.COM\\VEEAM\"\r\n$CompressionLevel = \"5\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Desired compression level (Optional; Possible values: 0 - None, 4 - Dedupe-friendly, 5 - Optimal, 6 - High, 9 - Extreme)\r\n$EnableQuiescence = $True\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Quiesce VM when taking snapshot (Optional; VMware Tools are required; Possible values: $True\/$False)\r\n$Retention = \"In3days\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Possible values: Never , Tonight, TomorrowNight, In3days, In1Week, In2Weeks, In1Month)\r\n\r\n$EnableNotification = $True\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Send an eMail about the backup when completed.\r\n$SMTPServer = \"smtp.domain.com\"\r\n$EmailFrom = \"veeam.site1@domain.com\"\r\n$EmailTo = \"myself@domain.com\"\r\n$EmailSubject = \"VM backup of SITE 1\"\r\n\r\n\r\n\r\n\r\n# Pour la cr\u00e9ation des objets n\u00e9cessaires au backup. Il n'est pas n\u00e9cessaire de les cr\u00e9er dans l'interface graphique.\r\n$ESX_name='ESXNAME01.domain.com'\r\n$ESX_User='root'\r\n$ESX_password='MemePasEnReve:-)'\r\n$NAS_name='NAS01'\r\n\r\n# Get-Command -Module VeeamPSSnapIn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # pour lister les commandes possibles...\r\n\r\n##################################################################\r\n#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 End User Defined Variables\r\n##################################################################\r\n\r\nAdd-PSSnapin VeeamPSSnapin\r\n\r\nConnect-VBRServer -server localhost\r\n\r\nif ( Find-VBRViEntity -name $ESX_name -HostsAndClusters ) {\r\n\u00a0 Write-Host \"ESX exist\" -foregroundcolor GREEN\r\n} else {\r\n\u00a0 Write-Host \"ESX does not exist. Create it\" -foregroundcolor CYAN\r\n\u00a0 Add-VBRESXi -Name $ESX_name -User $ESX_User -Password $ESX_password\r\n}\r\n\r\n$Server = Get-VBRServer -name $HostName\r\n\r\n# Cr\u00e9ation du repository.\r\n# Attention, les droits NTFS du share doivent autoriser l'objet COMPUTER a modifier les fichiers sur le NAS.\r\nif (Get-VBRBackupRepository -name $NAS_name ) {\r\n\u00a0 Write-Host \"Repository exist\" -foregroundcolor GREEN\r\n} else {\r\n\u00a0 Write-Host \"Repository does not exist. Create it\"\u00a0 -foregroundcolor CYAN\r\n\u00a0 Add-VBRBackupRepository -Name $NAS_name -Type CifsShare -RotatedDrive -Description \"Synology NAS\" -Server $server -Folder $Directory\r\n}\r\n\r\n# Creation du proxy pour backup local\r\nif ( ( Get-VBRViProxy | measure).count -ne 1\u00a0 ) {\r\n\u00a0 Write-Host \"Proxy does not exist. Create it\" -foregroundcolor CYAN\r\n\u00a0 Get-VBRServer | ? { $_.type -eq \"Local\" } | Add-VBRViProxy -Description \"Local Backup Proxy\" -MaxTasks 2\r\n} else {\r\n\u00a0 Write-Host \"Proxy exist\"\u00a0 -foregroundcolor GREEN\r\n}\r\n\r\n#################### Main program ################\r\n\r\n$MesssagyBody = @()\r\n\r\nforeach ($VM in Find-VBRViEntity -Server $Server | ? {$_.type -eq \"vm\" -and $_.name -notin $ExceptionVMNames -and $_.name -notlike \"*_clone_*\" }){\r\n\r\n\u00a0 Write-Host \"Starting backup of \" $VM.name -nonewline -foregroundcolor cyan\r\n\u00a0 $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention\r\n\u00a0 if ( $ZIPSession.Result -eq 'Failed' ) {\r\n\u00a0\u00a0\u00a0 Write-Host \". statut : \" $ZIPSession.Result -foregroundcolor RED\r\n\u00a0 } else {\r\n\u00a0\u00a0\u00a0 Write-Host \". statut : \" $ZIPSession.Result -foregroundcolor GREEN\r\n\u00a0 }\r\n\r\n\r\n\u00a0 If ($EnableNotification){\r\n\u00a0\u00a0\u00a0 $TaskSessions = $ZIPSession.GetTaskSessions().logger.getlog().updatedrecords\r\n\u00a0\u00a0\u00a0 $FailedSessions =\u00a0 $TaskSessions | where {$_.status -ne \"ESucceeded\"}\r\n\r\n\u00a0\u00a0\u00a0 if ($FailedSessions -ne $Null){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 $MesssagyBody = $MesssagyBody + ($ZIPSession | Select-Object @{n=\"Name\";e={($_.name).Substring(0, $_.name.LastIndexOf(\"(\"))}} ,@{n=\"Start Time\";e={$_.CreationTime}},@{n=\"End Time\";e={$_.EndTime}},Result,@{n=\"Details\";e={$FailedSessions.Title}})\r\n\u00a0\u00a0\u00a0 }Else{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 $MesssagyBody = $MesssagyBody + ($ZIPSession | Select-Object @{n=\"Name\";e={($_.name).Substring(0, $_.name.LastIndexOf(\"(\"))}} ,@{n=\"Start Time\";e={$_.CreationTime}},@{n=\"End Time\";e={$_.EndTime}},Result,@{n=\"Details\";e={($TaskSessions | sort creationtime -Descending | select -first 1).Title}})\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n}\r\n\r\nIf ($EnableNotification){\r\n\u00a0 #\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Email formatting\r\n\u00a0 $style = \"&lt;style&gt;BODY{font-family: Arial; font-size: 10pt;}\"\r\n\u00a0 $style+=\u00a0\u00a0 \"TABLE{border: 1px solid black; border-collapse: collapse;}\"\r\n\u00a0 $style+=\u00a0\u00a0 \"TH{border: 1px solid black; background: #ddddff; padding: 5px; }\"\r\n\u00a0 $style+=\u00a0\u00a0 \"TD{border: 1px solid black; padding: 5px; }\"\r\n\u00a0 $style+= \"&lt;\/style&gt;\"\r\n\r\n\u00a0 $Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo\r\n\u00a0 $Message.Subject = $EmailSubject\r\n\u00a0 $Message.IsBodyHTML = $True\r\n\u00a0 $message.Body = $MesssagyBody | ConvertTo-Html -head $style | Out-String\r\n\u00a0 $SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)\r\n\u00a0 $SMTP.Send($Message)\r\n}<\/pre>\n<div><\/div>\n<div>La commande pour la tache planifi\u00e9e :<\/div>\n<div><\/div>\n<pre>schtasks \/create \/SC daily \/TN Daily_VM_backup \/TR \"C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -file C:\\Script\\Veeam_Zip_SITE1.ps1\" \/ST 23:00 \/RU system<\/pre>\n<div><\/div>\n<div>Et voila&#8230;<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9-requis : Un share r\u00e9seau sur lequel l&rsquo;objet COMPUTER de la machine VEEAM a les droits en \u00e9criture. Le soft ignore les param\u00e8tres de credentials cr\u00e9\u00e9s pour l&rsquo;occasion, alors, autant s&rsquo;en passer compl\u00e8tement \ud83d\ude42 Le script doit \u00eatre lanc\u00e9 en tant qu&rsquo;administrateur !! J&rsquo;ai pr\u00e9f\u00e9r\u00e9 cr\u00e9er un script qui fait tout plut\u00f4t que de faire [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,42,50,34,58,14],"tags":[],"class_list":["post-514","post","type-post","status-publish","format-standard","hentry","category-datastore","category-nas","category-nfs","category-performances","category-powershell","category-vmware"],"_links":{"self":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/comments?post=514"}],"version-history":[{"count":1,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/514\/revisions"}],"predecessor-version":[{"id":515,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/514\/revisions\/515"}],"wp:attachment":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/media?parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/categories?post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/tags?post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}