PS-ManageInactiveAD : une boîte à outils PowerShell pour nettoyer votre Active Directory
15 scripts PowerShell open source pour auditer, nettoyer et surveiller votre Active Directory : comptes inactifs, groupes vides, ordinateurs obsolètes. Compatible Windows Server 2022 et 2025.
Chez la plupart des clients que nous reprenons en infogérance, l'Active Directory raconte l'histoire de l'entreprise : des centaines de comptes jamais utilisés, des groupes vides, des ordinateurs de l'époque de Windows 7, des comptes de service dont le mot de passe n'a pas changé depuis des années. Tout le monde sait qu'il faut faire le ménage. Peu d'équipes le font régulièrement, parce que le faire à la main est long et risqué.
Nous avons donc retravaillé une boîte à outils open source pour systématiser ce ménage : PS-ManageInactiveAD, 15 scripts PowerShell compatibles Windows Server 2022 et 2025, disponibles sur notre GitHub.
Pourquoi un AD mal entretenu pose problème
- C'est un risque de sécurité : un compte inactif mais toujours valide est une porte d'entrée que personne ne surveille.
- C'est du bruit : les recherches et les audits sont pollués par des objets obsolètes.
- Ce sont des licences gaspillées quand l'AD est synchronisé avec Microsoft 365.
- C'est un audit pénible : impossible de répondre clairement à la question « qui a accès à quoi ? ».
Ce que contient la boîte à outils
Nettoyage
| Script | Ce qu'il fait |
|---|---|
| Find-ADInactiveUsers | Repère les comptes utilisateurs sans connexion depuis X jours (90 par défaut). Peut les désactiver, les déplacer en quarantaine, puis les supprimer. |
| Find-ADInactiveComputers | La même chose pour les objets ordinateur. |
| Find-ADEmptyGroups | Liste les groupes de sécurité et de distribution sans membre. |
| Find-ADEmptyOU | Liste les unités d'organisation qui ne contiennent aucun objet. |
Audit de sécurité
| Script | Ce qu'il fait |
|---|---|
| Find-ADLockedAccounts | Liste les comptes verrouillés, avec option de déverrouillage en masse. |
| Find-ADPasswordNeverExpires | Repère les comptes dont le mot de passe n'expire jamais. |
| Find-ADStalePasswords | Trouve les mots de passe inchangés depuis X jours. |
| Find-ADPrivilegedAccounts | Audite les membres de neuf groupes privilégiés intégrés (Admins du domaine, Administrateurs de l'entreprise, Administrateurs du schéma, opérateurs de compte, de sauvegarde, de serveur, etc.). |
Maintenance
| Script | Ce qu'il fait |
|---|---|
| Find-ADDisabledInGroups | Repère les comptes désactivés encore membres de groupes. |
| Find-ADObsoleteOS | Liste les machines sous un système en fin de support. |
| Find-ADUnlinkedGPO | Trouve les GPO liées à aucune unité d'organisation. |
| Find-ADDuplicateSPN | Repère les SPN en double, qui cassent l'authentification Kerberos. |
Santé de l'annuaire
| Script | Ce qu'il fait |
|---|---|
| Test-ADReplicationHealth | Vérifie la réplication entre tous les contrôleurs de domaine. |
| Test-ADFSMORoles | Contrôle le placement et la disponibilité des cinq rôles FSMO. |
Audit complet
Invoke-ADFullAudit lance les 14 autres scripts d'un coup et produit un tableau de bord HTML, avec un lien vers chaque rapport détaillé. Une seule commande, et vous avez une vue complète de votre AD en quelques minutes.
Les choix de conception
Rien ne bouge par défaut
Chaque script produit d'abord un rapport, sans rien modifier : un CSV exploitable dans Excel et un rapport HTML lisible, qui s'ouvre à la fin de l'exécution. Les actions destructives ne s'activent qu'avec le paramètre correspondant, et -WhatIf permet toujours de simuler :
# Rapport seul, rien ne bouge
.\Find-ADInactiveUsers.ps1
# Désactivation
.\Find-ADInactiveUsers.ps1 -DisableUsers
# Simulation d'une suppression
.\Find-ADInactiveUsers.ps1 -DeleteUsers -WhatIf
La quarantaine avant la suppression
Supprimer directement un compte est rarement une bonne idée. La bonne pratique : désactiver, déplacer, attendre, puis supprimer. Les scripts suivent ce cycle :
# Étape 1 : désactiver et déplacer en quarantaine
.\Find-ADInactiveUsers.ps1 -DisableUsers -QuarantineOU "OU=Quarantaine,DC=exemple,DC=local"
# Étape 2, trente jours plus tard : supprimer depuis la quarantaine
.\Find-ADInactiveUsers.ps1 -SearchBase "OU=Quarantaine,DC=exemple,DC=local" -DeleteUsers
Un AD en français comme en anglais
Sur un Windows Server en français, « Domain Admins » s'appelle « Admins du domaine ». Un script qui cherche les groupes par leur nom ne trouve donc rien sur la moitié des AD de nos clients. Les groupes privilégiés sont identifiés par leur SID bien connu, ce qui rend l'audit indépendant de la langue.
Une liste d'OS à adapter
Par défaut, Find-ADObsoleteOS signale Windows XP à Windows 10, et Windows Server 2003 à 2019. Attention : Server 2016 et Server 2019 sont sortis du support standard, mais reçoivent encore des correctifs de sécurité en support étendu. Le paramètre -ObsoletePatterns permet d'ajuster la liste à votre propre politique.
Des paramètres communs
Tous les scripts partagent les mêmes options : -SearchBase et -ExcludeOU pour cibler ou exclure des unités d'organisation, -EnableLogging pour un journal horodaté, -EmailTo et -SmtpServer pour recevoir le rapport par mail, -NoOpen pour les tâches planifiées.
Mise en place
Prérequis : Windows Server 2022 ou 2025, PowerShell 5.1 ou plus, et le module Active Directory :
Install-WindowsFeature -Name RSAT-AD-PowerShell
Pas besoin de Git sur le serveur :
Invoke-WebRequest -Uri "https://github.com/SyNode-IT/PS-ManageInactiveAD/archive/refs/heads/main.zip" -OutFile "$env:TEMP\PS-ManageInactiveAD.zip"
Expand-Archive -Path "$env:TEMP\PS-ManageInactiveAD.zip" -DestinationPath "C:\Scripts" -Force
Rename-Item "C:\Scripts\PS-ManageInactiveAD-main" "C:\Scripts\PS-ManageInactiveAD"
Le seul fichier indispensable, en plus des scripts, est ADManagement-Common.ps1, qui doit rester dans le même dossier.
Planifier l'audit
Tout l'intérêt est de le faire tourner sans y penser. Une seule tâche planifiée suffit, exécutée par un compte de service aux droits limités :
$Action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\PS-ManageInactiveAD\Invoke-ADFullAudit.ps1" -NoOpen -EnableLogging -EmailTo "admin@exemple.fr" -SmtpServer "smtp.exemple.fr"'
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At '06:00'
Register-ScheduledTask -TaskName 'AD-FullAudit-Weekly' -Action $Action -Trigger $Trigger -User 'EXEMPLE\svc-adaudit'
Chaque lundi matin, le tableau de bord complet arrive par mail.
Le cycle que nous recommandons
Sur quatre semaines :
- Audit de sécurité : comptes privilégiés, mots de passe, SPN, réplication. On lit les rapports.
- Nettoyage des comptes : désactivation et mise en quarantaine des comptes inactifs, retrait des comptes désactivés de leurs groupes.
- Nettoyage de la structure : groupes vides, unités d'organisation vides, GPO orphelines, liste des machines à renouveler.
- Suppression : après validation des rapports précédents, suppression des objets en quarantaine.
Ce qu'il faut retenir
- Un AD se nettoie régulièrement, pas une fois tous les cinq ans.
- Commencez toujours en mode rapport : rien ne doit bouger avant que quelqu'un ait lu le résultat.
- Désactivez et mettez en quarantaine avant de supprimer.
- Identifiez les groupes privilégiés par leur SID, pas par leur nom.
- Ces scripts ne remplacent pas une solution d'audit complète ou un SIEM, mais ils couvrent les opérations de base que tout administrateur devrait automatiser.
Le projet est open source : n'hésitez pas à l'adapter à vos besoins sur GitHub.