Sophie synthétise tout ce qui a été vu depuis la section 7 : « Tu as le script de supervision multi-serveurs. Tu sais planifier une tâche. Tu sais envoyer un email. Assemble tout ça en une seule chaîne complète, qui tourne seule, chaque jour, sans que personne n’ait à y penser. »
Objectif
Combiner le script de supervision du TP N°3 (section 7), la planification (8.1) et l’envoi d’email (8.2) en un seul script autonome, puis l’enregistrer comme tâche planifiée quotidienne.
Ce TP suppose un serveur SMTP interne accessible pour simplifier (via Send-MailMessage, en acceptant sa dépréciation pour ce seul exercice pédagogique), plutôt que Microsoft Graph, pour rester réalisable sans configuration Azure AD complète. Libre à vous d’adapter avec Microsoft.Graph.Mail si vous disposez déjà d’un tenant Microsoft 365 de test.
Consignes
Étape 1 — Rassemblez le script du TP N°3 (rapport multi-serveurs) dans un fichier unique rapport-supervision.ps1, qui écrit son résultat dans un fichier horodaté (rapport-AAAAMMJJ.txt) plutôt que de l’afficher à l’écran.
Indice : revoyez le TP de la section 7, et la leçon 4.2 pour l’écriture de fichier avec Set-Content ou Out-File.
Étape 2 — À la fin du même script, ajoutez l’envoi automatique de ce fichier par email, en pièce jointe.
Indice : revoyez la leçon 8.2.
Étape 3 — Entourez l’ensemble du script d’un try/catch global : si une étape échoue (script ou envoi d’email), envoyez un second email d’alerte simplifié, sans pièce jointe, signalant l’échec.
Indice : revoyez la leçon 5.5 sur la gestion des erreurs.
Étape 4 — Enregistrez ce script comme tâche planifiée quotidienne à 8h, sous un compte de service dédié (fictif pour l’exercice, par exemple NORDIKA\svc-supervision).
Indice : revoyez la leçon 8.1, les trois briques Action/Trigger/Principal.
Étape 5 (bonus) — Configurez la tâche pour qu’elle retente automatiquement 3 fois en cas d’échec, espacées de 5 minutes.
Solution commentée
Étapes 1 à 3 — rapport-supervision.ps1 :
$dateRapport = Get-Date -Format "yyyyMMdd"
$cheminRapport = "C:\Nordika\Rapports\rapport-$dateRapport.txt"
try {
$serveurs = Get-Content -Path "C:\Nordika\Scripts\serveurs.txt"
$resultats = Invoke-Command -ComputerName $serveurs -ScriptBlock {
$service = Get-Service -Name "Spooler" -ErrorAction SilentlyContinue
$volume = Get-Volume -DriveLetter C
[PSCustomObject]@{
StatutService = $service.Status
EspaceLibrePourcent = [math]::Round(($volume.SizeRemaining / $volume.Size) * 100, 1)
}
} -ErrorAction Stop
$resultats |
Select-Object -Property PSComputerName, StatutService, EspaceLibrePourcent |
Sort-Object -Property EspaceLibrePourcent |
Format-Table -AutoSize |
Out-File -FilePath $cheminRapport
Send-MailMessage -From "[email protected]" `
-To "[email protected]" `
-Subject "Rapport de supervision - $dateRapport" `
-Body "Rapport généré automatiquement, voir pièce jointe." `
-Attachments $cheminRapport `
-SmtpServer "smtp.nordika.local"
} catch {
Send-MailMessage -From "[email protected]" `
-To "[email protected]" `
-Subject "ÉCHEC - Rapport de supervision du $dateRapport" `
-Body "Le script a échoué : $($_.Exception.Message)" `
-SmtpServer "smtp.nordika.local"
}
Étapes 4 et 5 — enregistrement de la tâche planifiée :
$action = New-ScheduledTaskAction -Execute "pwsh.exe" `
-Argument "-NoProfile -File C:\Nordika\Scripts\rapport-supervision.ps1"
$declencheur = New-ScheduledTaskTrigger -Daily -At "08:00"
$principal = New-ScheduledTaskPrincipal -UserId "NORDIKA\svc-supervision" `
-LogonType ServiceAccount -RunLevel Highest
$parametres = New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "Rapport-Supervision-Quotidien" `
-Action $action -Trigger $declencheur `
-Principal $principal -Settings $parametres `
-Description "Rapport de supervision multi-serveurs, envoyé chaque matin à 8h"
Points clés à retenir :
- Le
try/catch englobe tout le script, contrairement au TP de la section 5 où l’erreur était gérée par ligne de CSV : ici, un échec sur Invoke-Command ou sur l’envoi d’email doit déclencher une alerte, pas seulement un avertissement silencieux. - Le second email (dans le
catch) est volontairement plus simple : pas de pièce jointe, car le rapport n’a justement pas pu être généré correctement. -NoProfile (vu en 8.1) reste présent dans l’action planifiée, même si le script est maintenant plus complet.
Retour d’expérience terrain : ce TP correspond, presque trait pour trait, au premier vrai script d’automatisation complet qu’on écrit généralement en entreprise après avoir appris les bases de PowerShell — et c’est aussi l’un des plus révélateurs : le jour où l’email d’échec arrive dans la boîte de Sophie plutôt qu’un silence radio, on comprend concrètement pourquoi la gestion d’erreurs de la section 5 n’était pas un détail optionnel.