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 :

  1. Audit de sécurité : comptes privilégiés, mots de passe, SPN, réplication. On lit les rapports.
  2. Nettoyage des comptes : désactivation et mise en quarantaine des comptes inactifs, retrait des comptes désactivés de leurs groupes.
  3. Nettoyage de la structure : groupes vides, unités d'organisation vides, GPO orphelines, liste des machines à renouveler.
  4. 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.


💬
Besoin d'un coup de main sur votre informatique ? SyNode-IT accompagne les entreprises au quotidien : support, infogérance, cloud, réseau et cybersécurité.