Vérifier l’espace disque des serveurs, repérer les comptes inactifs, contrôler que la sauvegarde de la nuit a bien tourné, préparer l’arrivée d’un nouveau salarié : ces tâches reviennent chaque semaine et prennent un temps précieux quand on les fait à la main. PowerShell, présent sur tous les Windows, permet de les automatiser en quelques lignes. Voici 12 scripts prêts à adapter, classés par usage, et les règles pour les exécuter en toute sécurité.
L’essentiel en 30 secondes
- Les scripts ci-dessous fonctionnent avec Windows PowerShell 5.1 et PowerShell 7 ; ceux qui concernent Active Directory nécessitent le module RSAT ActiveDirectory.
- Testez toujours avec
-WhatIfavant toute suppression ou modification. - Planifiez-les avec le Planificateur de tâches, sous un compte de service dédié aux droits limités.
- Journalisez leur exécution avec
Start-Transcriptpour garder une trace.
Active Directory : hygiène des comptes
1. Lister les comptes utilisateurs inactifs depuis 90 jours
Import-Module ActiveDirectory
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly |
Where-Object Enabled |
Select-Object Name, SamAccountName, LastLogonDate |
Export-Csv C:\Rapports\comptes-inactifs.csv -NoTypeInformation -Encoding UTF8
Un compte inactif mais actif est une porte ouverte, notamment après un départ. Voir notre procédure de départ d’un salarié.
2. Repérer les mots de passe qui n’expirent jamais
Get-ADUser -Filter 'Enabled -eq $true -and PasswordNeverExpires -eq $true' -Properties PasswordLastSet |
Select-Object Name, SamAccountName, PasswordLastSet |
Sort-Object PasswordLastSet
3. Lister les membres des groupes à privilèges
$groupes = 'Admins du domaine', 'Administrateurs de l''entreprise', 'Administrateurs', 'Opérateurs de compte', 'Opérateurs de sauvegarde'
foreach ($g in $groupes) {
Get-ADGroupMember -Identity $g -Recursive |
Select-Object @{n='Groupe';e={$g}}, Name, SamAccountName
}
Adaptez les noms de groupes à la langue de votre annuaire. Pour aller plus loin, voir détecter les comptes à privilèges excessifs.
4. Créer un nouvel utilisateur à partir d’un modèle
$modele = Get-ADUser -Identity 'modele.compta' -Properties MemberOf
$mdp = Read-Host 'Mot de passe initial' -AsSecureString
New-ADUser -Name 'Claire Martin' -GivenName 'Claire' -Surname 'Martin' -SamAccountName 'c.martin' -UserPrincipalName 'c.martin@entreprise.fr' -Path 'OU=Utilisateurs,DC=entreprise,DC=local' -AccountPassword $mdp -ChangePasswordAtLogon $true -Enabled $true
$modele.MemberOf | ForEach-Object { Add-ADGroupMember -Identity $_ -Members 'c.martin' }
Serveurs : état et capacité
5. Rapport d’espace disque sur plusieurs serveurs
$serveurs = 'SRV-FICHIERS', 'SRV-APPLI', 'SRV-SAUV'
Get-CimInstance Win32_LogicalDisk -ComputerName $serveurs -Filter 'DriveType=3' |
Select-Object PSComputerName, DeviceID,
@{n='Libre (Go)';e={[math]::Round($_.FreeSpace/1GB,1)}},
@{n='Libre (%)';e={[math]::Round($_.FreeSpace/$_.Size*100,0)}} |
Where-Object 'Libre (%)' -lt 15
6. Services automatiques arrêtés
Get-CimInstance Win32_Service -Filter "StartMode='Auto' AND State<>'Running'" |
Select-Object Name, DisplayName, State
7. Date du dernier redémarrage et de la dernière mise à jour
$os = Get-CimInstance Win32_OperatingSystem
$maj = Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1
[pscustomobject]@{
Serveur = $env:COMPUTERNAME
DernierDemarrage = $os.LastBootUpTime
DerniereMiseAJour = $maj.InstalledOn
KB = $maj.HotFixID
}
8. Certificats qui expirent dans les 30 jours
Get-ChildItem Cert:\LocalMachine\My |
Where-Object NotAfter -lt (Get-Date).AddDays(30) |
Select-Object Subject, NotAfter, Thumbprint
Les certificats expirés provoquent des pannes spectaculaires : voir automatiser la surveillance des certificats TLS.
Maintenance et contrôles
9. Nettoyer les vieux fichiers de journaux
Get-ChildItem 'D:\Logs' -Recurse -File |
Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) |
Remove-Item -WhatIf
Retirez -WhatIf seulement après avoir vérifié la liste des fichiers concernés.
10. Vérifier que la sauvegarde de la nuit existe
$dernier = Get-ChildItem '\\NAS\Sauvegardes\SRV-FICHIERS' -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (-not $dernier -or $dernier.LastWriteTime -lt (Get-Date).AddHours(-26)) {
Write-Warning 'Aucune sauvegarde récente trouvée'
# Envoyer une alerte (webhook Teams, relais SMTP, outil de supervision)
}
Une sauvegarde présente n’est pas une sauvegarde restaurable : complétez par des tests de restauration.
11. Inventaire rapide des postes du domaine
Get-ADComputer -Filter * -Properties OperatingSystem, OperatingSystemVersion, LastLogonDate |
Select-Object Name, OperatingSystem, OperatingSystemVersion, LastLogonDate |
Export-Csv C:\Rapports\inventaire-postes.csv -NoTypeInformation -Encoding UTF8
12. Contrôler les sessions et connexions RDP récentes
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-1)} |
Where-Object { $_.Properties[8].Value -eq 10 } |
Select-Object TimeCreated, @{n='Compte';e={$_.Properties[5].Value}}, @{n='Source';e={$_.Properties[18].Value}}
Le type de connexion 10 correspond aux ouvertures de session à distance (RDP). Voir aussi les événements Windows à surveiller et sécuriser les accès RDP.
Exécuter ses scripts en sécurité
| Règle | Pourquoi |
|---|---|
Stratégie d’exécution RemoteSigned ou AllSigned |
Empêche l’exécution de scripts téléchargés non signés |
| Scripts stockés dans un dossier en lecture seule pour les utilisateurs | Un script modifiable par un tiers devient une porte dérobée |
| Compte de service dédié (idéalement gMSA) | Pas de mot de passe à gérer, droits limités au besoin |
Start-Transcript et journalisation des blocs de script |
Traçabilité et détection d’usages malveillants |
| Aucun mot de passe en clair dans les scripts | Utiliser SecretManagement ou un coffre-fort de secrets |
| Versionnage (Git) | Savoir qui a modifié quoi, revenir en arrière |
Questions fréquentes
Faut-il utiliser PowerShell 7 ou Windows PowerShell 5.1 ?
Les deux coexistent. PowerShell 7 est plus rapide et multiplateforme ; certains modules anciens ne fonctionnent qu’en 5.1. Les scripts de cet article fonctionnent dans les deux versions, avec le module ActiveDirectory pour les premiers.
Comment planifier un script ?
Avec le Planificateur de tâches : action « powershell.exe » ou « pwsh.exe », argument -NoProfile -File C:\Scripts\rapport.ps1, exécution sous un compte de service, que l’utilisateur soit connecté ou non.
Un antivirus peut-il bloquer mes scripts ?
Oui, certains comportements ressemblent à ceux d’outils malveillants. Signez vos scripts et déclarez le dossier aux équipes de sécurité plutôt que de désactiver la protection.
Comment recevoir les rapports par e-mail ?
La commande Send-MailMessage est obsolète. Utilisez un relais SMTP authentifié via une bibliothèque dédiée, un webhook (Teams, Slack) ou votre outil de supervision.
Sources
- Microsoft Learn, documentation PowerShell.
- Microsoft Learn, module ActiveDirectory.
- Microsoft Learn, stratégies d’exécution PowerShell.
Besoin d’un accompagnement ?
MPCÂBLE Solutions Informatiques (MPCSI) accompagne particuliers, entreprises, associations et collectivités depuis Gaudiès, en Ariège : sur site en Occitanie, principalement dans un rayon de 40 km (Pamiers, Foix, Mirepoix, Saverdun, Castelnaudary), et à distance partout en France. Nous mettons en place ces automatisations dans le cadre de notre infogérance. Demandez un devis gratuit ou appelez le 05 32 42 99 98.
