PowerShell est l’outil le plus rentable dans la boîte à outils d’un administrateur système. Bien utilisé, il réduit les tâches manuelles, améliore la fiabilité des opérations et renforce la sécurité. Voici 5 scripts PowerShell indispensables pour tout sysadmin, avec des exemples concrets prêts à adapter.
1) Inventaire système automatisé
Objectif: récupérer rapidement les infos clés (OS, uptime, disque, patchs).
# Inventaire local simple
$os = Get-CimInstance Win32_OperatingSystem
$cs = Get-CimInstance Win32_ComputerSystem
$disks = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Domain = $cs.Domain
OS = $os.Caption
Build = $os.BuildNumber
LastBoot = $os.LastBootUpTime
}
$disks | Select-Object DeviceID,
@{N='FreeGB';E={[math]::Round($_.FreeSpace/1GB,2)}},
@{N='SizeGB';E={[math]::Round($_.Size/1GB,2)}}
Astuce: ajoute Export-Csv pour historiser l’état du parc.
2) Audit des privilèges (admins locaux + AD)
Objectif: détecter les dérives d’accès rapidement.
# Membres du groupe Administrateurs local
Get-LocalGroupMember -Group "Administrators" |
Select-Object Name, ObjectClass, PrincipalSource
# Exemple AD (module ActiveDirectory requis)
Get-ADGroupMember "Domain Admins" -Recursive |
Select-Object Name, SamAccountName, ObjectClass |
Export-Csv C:\Reports\domain-admins.csv -NoTypeInformation -Encoding UTF8
Astuce: planifie un export hebdo et compare avec la semaine précédente.
3) Monitoring et auto-heal de services critiques
Objectif: redémarrer automatiquement un service arrêté et alerter en cas d’échec.
$services = @('W3SVC','MSSQLSERVER','VeeamAgent')
foreach ($svc in $services) {
$s = Get-Service -Name $svc -ErrorAction SilentlyContinue
if ($null -eq $s) { continue }
if ($s.Status -ne 'Running') {
try {
Start-Service -Name $svc -ErrorAction Stop
Write-Output "[$svc] redémarré avec succès"
}
catch {
Write-Output "[$svc] échec redémarrage: $($_.Exception.Message)"
# Ici: webhook Teams/Slack ou Send-MailMessage (legacy)
}
}
}
Astuce: ajoute une limite de tentatives pour éviter les boucles infinies.
4) Contrôle backup + test de restauration
Objectif: vérifier qu’un backup récent existe et qu’il est exploitable.
# Vérifie l'âge des fichiers de backup dans un dossier
$path = "D:\Backups"
$maxHours = 24
$latest = Get-ChildItem $path -File |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
if ($null -eq $latest) {
Write-Error "Aucun backup trouvé"
exit 1
}
$ageHours = (New-TimeSpan -Start $latest.LastWriteTime -End (Get-Date)).TotalHours
if ($ageHours -gt $maxHours) {
Write-Error "Backup trop ancien: $([math]::Round($ageHours,1))h"
exit 2
}
Write-Output "OK backup récent: $($latest.Name) ($([math]::Round($ageHours,1))h)"
Astuce: complète ce check avec un vrai test de restauration en environnement isolé.
5) Conformité patching + reboot pending
Objectif: identifier les serveurs non conformes et ceux qui attendent un redémarrage.
# Hotfix récents
Get-HotFix |
Sort-Object InstalledOn -Descending |
Select-Object -First 20 HotFixID, Description, InstalledOn
# Détection reboot pending (registre)
$rebootPending = Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
RebootPending = $rebootPending
CheckedAt = Get-Date
}
Astuce: exécute ce script à distance via Invoke-Command pour une vue multi-serveurs.
Bonnes pratiques de production
- Versionner les scripts dans Git.
- Ne jamais stocker les secrets en clair.
- Logger chaque exécution (succès/échec/durée).
- Tester en préprod avant rollout global.
- Planifier via Task Scheduler ou orchestrateur central.
Conclusion
Ces exemples donnent une base immédiatement actionnable. Le plus important: les adapter à votre contexte, les standardiser, puis les exécuter de manière répétable. En sysadmin, l’automatisation utile vaut mieux qu’un script “parfait” jamais lancé.