Automatiser la sauvegarde par robocopy avec notification par mail

Aujourd’hui nous allons vous présenter comment automatiser la sauvegarde des données d’un ordinateur avec une tâche planifiée de robocopy et ensuite recevoir une notification par mail en cas de succès ou d’échec de la sauvegarde. Pour arriver à notre but nous allons segmenter notre travail en quatre grandes parties.

1 – Création du script de Robocopy

Nous allons créer un script nommé Backup.bat contenant le script robocopy ci-dessous à adapteur en fonction de vos besoins dans le répertoire C:\scripts\ de notre ordinateur

@ECHO OFF


REM Définition des variables a modifier selon vos besoins

set src="repertoireasauvegarder"
set dest="repertoirededestination"
Set Logname="C:\scripts\backup.log"

ECHO "Copie des données... Veuillez patienter. . ."


REM Notification en cas d'échec du robocopy
robocopy "%src%" "%dest%" /E /XA:S /XF *.tmp *.bak /XO /TEE /R:2 /W:2  /LOG:%Logname%  

if %ERRORLEVEL% EQU 16 echo ***ERREUR FATALE*** & goto end2
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 14 echo ECHEC + MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end2
if %ERRORLEVEL% EQU 12 echo ECHEC+ MISMATCHES & goto end2
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end2
if %ERRORLEVEL% EQU 10 echo ECHEC+ XTRA & goto end2
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end2
if %ERRORLEVEL% EQU 8 echo ECHEC & goto end2
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end2
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end2
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end2
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto success2
if %ERRORLEVEL% EQU 2 echo XTRA & goto success2
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto success2
if %ERRORLEVEL% EQU 0 echo Aucune modification & goto success2

:end2

REM Notification en cas d'échec de la tâche de robocopy
C:\Scripts\EchecEmail.bat

exit

:success2

REM Notification de réussite de la tâche de robocopy

C:\Scripts\SuccessEmail.bat

Pour rappel, voici en détails les options utilisés par notre tâche de robocopy pour sauvegarder nos données

/E Copie les sous-répertoires.

/XA:S Exclu de la sauvegarde les fichiers systèmes

/XF *.tmp *.bak Exclu de la sauvegarde les fichiers ayant les extensions en .tmp et .back

/XO Exclut les fichiers plus anciens

/TEE Écrit la sortie de l’état dans la fenêtre de console, ainsi que dans le fichier journal

/R:2 Définit à 2 le nombre de tentatives de copies ayant échouées

/W:2 Définit à 2 secondes le délai d’attente entre 2 tentatives

/LOG Écrit la sortie de l’état dans le fichier journal (remplace le fichier journal existant)

2 – Création des scripts d’exécution de la notification

Comme indiqué dans notre script de sauvegarde backup.bat, nous allons devoir créer un script nommé EchecEmail.bat dans le répertoire C:\scripts\ contenant la commande ci-dessous

powershell -ExecutionPolicy ByPass -File C:\Scripts\robofail.ps1

Nous devons aussi créer le script SuccessEmail.bat dans le même répertoire contenant la commande ci-dessous

powershell -ExecutionPolicy ByPass -File C:\Scripts\roboSuccess.ps1

Ces deux scripts vont permettre d’exécuter les commandes PowerShell ci-dessous qui vont permettre de nous envoyer des notifications par mail.

3 – Création des scripts de notification par mail

Vous avez deux fonctions possibles pour envoyer des mails via PowerShell, en fonction de votre version de PowerShell vous pouvez utiliser une des deux méthodes pour les notifications par email.

Mais avant d’utiliser une des méthodes nous devons créer un fichier crypté avec notre mot de passe pour se connecter à notre système de messagerie. Ouvrez une console PowerShell en administrateur et exécutez le code ci-dessous pour créer le fichier crypté de notre mot de passe dans le répertoire C:\scripts\identification.txt

"Votremotdepasse" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\scripts\identification.txt"

Après avoir exécuté la commande, vous ouvrez le fichier identification.txt et nous pouvons observer que notre mot de passe est bien crypté.

Vous pouvez désormais choisir la méthode a) ou la méthode b) pour la notification par mail, en fonction de votre version de PowerShell. Je vous recommander d’appliquer en priorité la méthode a)

a ) La méthode par $SMTPClient.Send($SMTPMessage)

Nous allons commencer par créer le script roboSuccess.ps1 pour la notification en cas de succès de la tâche de robocopy. Bien évidemment les scripts sont à adapter en fonction de vos besoins.

#Date au format 01/12/2021
$date = Get-Date -Format 'dd/MM/yyyy'

#Heure au format 18:10:15
$heure =  Get-Date -Format 'HH:mm:ss'

#Adresse mail
$User = "sauvegarde@networks-it.fr"

#Fichier contenant le mot de passe crypté
$Identification = "C:\Scripts\identification.txt"

#déchiffrement du  mot de passe
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $Identification | ConvertTo-SecureString)

#Le destinataire du mail
$EmailTo = "gabinhocity@networks-it.fr"

#L’émetteur de l'email
$EmailFrom = "sauvegarde@networks-it.fr"

#Le sujet du mail
$Subject = "Succès de la sauvegarde des données du PC TEST le " + $date

#Le corps du mail 
$Body = "La sauvegarde des données du PC TEST s'est effectuée avec succès le " + $date + " à " +$heure

#Le serveur Smtp
$SMTPServer = "smtp.networks-it.fr" 

#Commande d'envoi
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password); 
$SMTPClient.Send($SMTPMessage) 

Ensuite nous devons créer le script robofail.ps1 pour la notification en cas d’échec de la sauvegarde

#Date au format 01/12/2021
$date = Get-Date -Format 'dd/MM/yyyy'

#Heure au format 18:10:15
$heure =  Get-Date -Format 'HH:mm:ss'

#Adresse mail
$User = "sauvegarde@networks-it.fr"

#Serveur smtp
$SMTPServer = "smtp.networks-it.fr" 

#Fichier contenant le mot de passe crypté
$Identification = "C:\Scripts\identification.txt"

#déchiffrement du  mot de passe
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $Identification | ConvertTo-SecureString)

#Le destinataire du mail
$EmailTo = "gabinhocity@networks-it.fr"

#L’émetteur de l'email
$EmailFrom = "sauvegarde@networks-it.fr"

#Le sujet du mail
$Subject = "PC TEST Echec de la sauvegarde des données le " + $date

#Le corps du mail 
$Body = "Echec de la sauvegarde de données du pc TEST le " + $date + " à " +$heure + ". Veuillez lire les informations du fichier de log ci-joint pour réssourdre le problème" 

#Emplacement du fichier de log du robocopy
$filenameAndPath = "C:\Scripts\backup.log"

#Commande d'envoi du mail avec le fichier de log en pièce jointe
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password); 
$SMTPClient.Send($SMTPMessage) 

b) La méthode par Send-MailMessage

Cette cmdlet est obsolète. Je ne vous recommande pas de l’utiliser car elle ne garantie pas une connexion fiable et sécurisée avec votre serveur smtp. Si vous le pouvez, mettez à jour votre version de PowerShell et utilisez la méthode a)

Le script robofail .ps1 pour la notification en cas d’échec de la tâche de robocopy.

#Date au format 01/12/2021
$date = Get-Date -Format 'dd/MM/yyyy'

#Heure au format 18:10:15
$heure =  Get-Date -Format 'HH:mm:ss'

#Serveur smtp
$SmtpUser = 'contact@networks-it.fr'

#Fichier contenant le mot de passe crypté
$Identification = "C:\Scripts\identification.txt"

#Serveur Smtp
$SmtpServer = 'smtp.networks-it.fr'

#Le destinataire du mail
$MailTo = "contact@networks-it.fr"

#L’émetteur de l'email
$MailFrom = 'contact@networks-it.fr'

#Le sujet du mail
$MailSubject = "Echec de la sauvegarde des donnees du PC TEST le " + $date


#Fichier de log à joindre au mail pour identifier l'erreur 
$piecejointe = "C:\Scripts\backup.log"

#Serveur smtp
$SmtpUser = 'contact@networks-it.fr'

#Le corps du mail 
$Body = "Echec de la sauvegarde de donnees du pc TEST le " + $date + " a " +$heure + ". Veuillez lire les informations du fichier de log ci-joint pour ressourdre le probleme" 

#Authentification au serveur de messagerie 
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $SmtpUser, (Get-Content $Identification | ConvertTo-SecureString)


#Commande d'envoi du mail avec le fichier de log en pièce jointe
Send-MailMessage -To "$MailTo" -from "$MailFrom"  -Attachments $piecejointe  -Subject $MailSubject  -Body $Body -Encoding "UTF8" -SmtpServer $SmtpServer -UseSsl -Port 587

Ensuite nous devons créer le script robosuccess.ps1 pour la notification en cas de réussite de la sauvegarde

#Date au format 01/12/2021
$date = Get-Date -Format 'dd/MM/yyyy'

#Heure au format 18:10:15
$heure =  Get-Date -Format 'HH:mm:ss'

#Serveur smtp
$SmtpUser = 'contact@networks-it.fr'

#Fichier contenant le mot de passe crypté
$Identification = "C:\Scripts\identification.txt"

#Serveur Smtp
$SmtpServer = 'smtp.networks-it.fr'

#Le destinataire du mail
$MailTo = "contact@networks-it.fr"

#L’émetteur de l'email
$MailFrom = 'contact@networks-it.fr'

#Le sujet du mail
$MailSubject = "Succes de la sauvegarde des donnees du PC TEST le " + $date

#Le corps du mail 
$Body = "Succes de la sauvegarde de donnees du pc TEST le " + $date + " à " +$heure 

#Authentification au serveur de messagerie 
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $SmtpUser, (Get-Content $Identification | ConvertTo-SecureString)

#Commande d'envoi
Send-MailMessage -To "$MailTo" -from "$MailFrom"  -Subject $MailSubject  -Body $Body -Encoding "UTF8" -SmtpServer $SmtpServer -UseSsl -Port 587

Pour finir, nous allons créer une tâche planifiée qui va exécuter la tâche automatiquement à des heures planifiées

4 – Création de la tâche planifiée

Nous allons créer une tâche planifiée qui va exécuter la sauvegarde de nos données tous les jours à 06:00 du matin. Nous allons ouvrir le planificateur de tâches de Windows et on clique sur Créer un tâche…

Dans l’onglet Général, il faut nommer votre tâche et dans les options de sécurité il faut cocher l’option « Exécuter même si l’utilisateur n’est pas connecté.

Dans l’onglet Déclencheurs, il faut cliquer sur Nouveau… et définir la périodicité de vos sauvegardes

Dans l’onglet Actions, il faut cliquer sur Nouveau… et définir le script de sauvegarde backup.bat comme action à exécuter

Nous pouvons cliquer à nouveau sur OK pour terminer la création de notre tâche planifiée

Pour tester le fonctionnement de notre nouvelle tâche, nous pouvons faire un clique droit sur la tâche et cliquer sur Exécuter pour démarrer le script.

Une fois la sauvegarde terminée, nous devons recevoir un mail pour nous confirmer le bon déroulement de la sauvegarde

ou dans le cas contraire, nous allons recevoir un mail d’échec avec en copie le fichier de log pour nous aider à identifier la source de l’erreur.