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.
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.
Autodidacte dans la majeure partie de mes compétences et créateur du site gabinhocity.eu, je surf tant bien sur la vague Windows que Linux. Profondément passionné par la découverte, mes loisirs sont partagés entre la photographie et les voyages.
Merci beaucoup, exactement ce que je cherchais!
Ca fonctionne directement avec une mail Office365.
Encore merci.
Bonjour,
C’est parfait 🙂
Pour plus de sécurité, j’ai créé un connecteur smtp pour l’envoi des mails en interne sans authentification, ce qui permet de l’utiliser dans mon script sans avoir à mettre de mot de passe.
Bonjour,
Pourquoi les accents dans l’objet et body ne sont pas mis sur la version avec Send-Mail ?
Merci
Bonjour,
Effectivement c’est l’un des inconvénients de la version Send-Mail