PS-ManageInactiveAD : une boîte à outils PowerShell pour nettoyer votre Active Directory

PS-ManageInactiveAD : 15 scripts PowerShell pour reprendre le contrôle de votre Active Directory

Qui n'a jamais ouvert la console Active Directory Users and Computers pour tomber sur des centaines de comptes jamais utilisés, des groupes vides, et des objets ordinateur datant de l'ère Windows 7 ? Le ménage AD, tout le monde sait qu'il faut le faire. Peu d'équipes le font régulièrement.

PS-ManageInactiveAD est une boîte à outils open source que j'ai retravaillée pour répondre à ce besoin. 15 scripts PowerShell, compatibles Windows Server 2022 et 2025, couvrant l'audit, le nettoyage et la surveillance de votre environnement AD.


Le problème

Un Active Directory qui n'est pas entretenu, c'est :

  • Un risque de sécurité : des comptes inactifs sont des portes d'entrée potentielles pour un attaquant
  • Du bruit dans vos annuaires : les recherches sont polluées par des objets obsolètes
  • Des licences gaspillées : des comptes actifs qui ne devraient plus l'être
  • Des audits douloureux : impossible de répondre clairement à "qui a accès à quoi ?"

Le nettoyage manuel est fastidieux et sujet aux erreurs. Les scripts permettent de le systématiser.


Ce que contient la boîte à outils

Nettoyage AD

Script Ce qu'il fait
Find-ADInactiveUsers Détecte les comptes utilisateurs qui ne se sont pas connectés depuis X jours. Peut désactiver, déplacer en quarantaine et supprimer.
Find-ADInactiveComputers Idem pour les objets ordinateur.
Find-ADEmptyGroups Liste les groupes de sécurité et de distribution sans aucun membre.
Find-ADEmptyOU Liste les OUs qui ne contiennent aucun objet.

Audit sécurité

Script Ce qu'il fait
Find-ADLockedAccounts Liste les comptes verrouillés, avec option de déverrouillage en masse.
Find-ADPasswordNeverExpires Détecte les comptes avec le flag "Le mot de passe n'expire jamais".
Find-ADStalePasswords Trouve les comptes dont le mot de passe n'a pas changé depuis X jours.
Find-ADPrivilegedAccounts Audite les membres de Domain Admins, Enterprise Admins et 8 autres groupes privilégiés.

Maintenance

Script Ce qu'il fait
Find-ADDisabledInGroups Détecte les comptes désactivés qui sont encore membres de groupes (risque de sécurité).
Find-ADObsoleteOS Liste les machines sous OS en fin de vie (XP à Server 2019).
Find-ADUnlinkedGPO Trouve les GPOs orphelines non liées à aucune OU.
Find-ADDuplicateSPN Détecte les SPNs en doublon qui cassent l'authentification Kerberos.

Santé AD

Script Ce qu'il fait
Test-ADReplicationHealth Vérifie la réplication entre tous les contrôleurs de domaine.
Test-ADFSMORoles Audite le placement et la disponibilité des 5 rôles FSMO.

Audit complet

Script Ce qu'il fait
Invoke-ADFullAudit Lance les 14 scripts d'un coup et génère un tableau de bord HTML récapitulatif avec liens vers chaque rapport individuel.

Un seul .\Invoke-ADFullAudit.ps1 et vous avez une vue complète de votre AD en quelques minutes.


Philosophie de conception

Mode safe par défaut

Chaque script génère un rapport sans rien modifier. Deux formats sont produits automatiquement : un CSV (exploitable dans Excel) et un rapport HTML stylisé avec cartes résumé et couleurs de statut. Le rapport HTML s'ouvre automatiquement à la fin de l'exécution.

Les actions destructives (désactiver, supprimer) ne s'activent que si vous passez explicitement le switch correspondant :

# Rapport seul - rien ne bouge (ouvre le HTML automatiquement)
.\Find-ADInactiveUsers.ps1

# On désactive
.\Find-ADInactiveUsers.ps1 -DisableUsers

# On simule d'abord
.\Find-ADInactiveUsers.ps1 -DeleteUsers -WhatIf

Workflow de quarantaine

Plutôt que de supprimer directement un compte, la bonne pratique c'est : désactiver, déplacer, attendre, puis supprimer. Les scripts supportent ce workflow nativement :

# Étape 1 : désactiver et déplacer en quarantaine
.\Find-ADInactiveUsers.ps1 -DisableUsers -QuarantineOU "OU=Quarantine,DC=corp,DC=local"

# Étape 2 (30 jours plus tard) : supprimer depuis la quarantaine
.\Find-ADInactiveUsers.ps1 -SearchBase "OU=Quarantine,DC=corp,DC=local" -DeleteUsers

Paramètres communs

Tous les scripts partagent les mêmes paramètres pour une expérience homogène :

  • -ReportFilePath : chemin du CSV (défaut Rapports\<NomScript>.csv)
  • -NoOpen : désactive l'ouverture auto du rapport HTML (pour les tâches planifiées)
  • -SearchBase / -ExcludeOU : cibler ou exclure des OUs
  • -EnableLogging : log horodaté dans Rapports\Logs\
  • -EmailTo / -SmtpServer : notification email automatique
  • -WhatIf / -Confirm : simulation et confirmation

Mise en place

Prérequis

  • Windows Server 2022 ou 2025
  • PowerShell 5.1+
  • RSAT (module ActiveDirectory)
Install-WindowsFeature -Name RSAT-AD-PowerShell

Installation

Pas besoin de Git sur le serveur. Téléchargez le ZIP directement depuis PowerShell :

# Télécharger et extraire
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"

# Lancer un audit complet
cd C:\Scripts\PS-ManageInactiveAD
.\Invoke-ADFullAudit.ps1

Si Git est installé sur le serveur, vous pouvez aussi cloner le dépôt :

git clone https://github.com/SyNode-IT/PS-ManageInactiveAD.git C:\Scripts\PS-ManageInactiveAD

C'est tout. Pas de module à installer, pas de dépendance complexe. Le seul fichier obligatoire est ADManagement-Common.ps1 qui doit rester dans le même répertoire que les scripts.


Automatisation

Le vrai intérêt de ces scripts, c'est de les planifier. Avec Invoke-ADFullAudit.ps1, une seule tâche planifiée lance tout :

$Action = New-ScheduledTaskAction -Execute 'powershell.exe' `
  -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\PS-ManageInactiveAD\Invoke-ADFullAudit.ps1" -NoOpen -EnableLogging -EmailTo "admin@corp.local" -SmtpServer "smtp.corp.local"'

$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At '06:00'

Register-ScheduledTask -TaskName 'AD-FullAudit-Weekly' `
  -Action $Action -Trigger $Trigger `
  -User 'DOMAIN\svc-admanagement'

Tous les lundis matin à 6h, vous recevez un tableau de bord complet de votre AD par email. Simple et efficace.


Cas d'usage concret : le ménage mensuel

Voici le workflow que je recommande sur un cycle de 4 semaines :

Semaine 1 - Audit sécurité : lancer les scripts d'audit (comptes privilégiés, mots de passe, SPNs, réplication). Analyser les rapports.

Semaine 2 - Nettoyage des comptes : désactiver les comptes inactifs, les déplacer en quarantaine. Nettoyer les appartenances aux groupes des comptes désactivés.

Semaine 3 - Nettoyage structurel : traiter les groupes vides, OUs vides, GPOs orphelines. Lister les machines sous OS obsolète.

Semaine 4 - Suppression : après validation des rapports des semaines précédentes, supprimer les objets en quarantaine.


Documentation

Le projet inclut une documentation technique complète au format HTML couvrant chaque script en détail : paramètres, exemples, colonnes CSV, droits requis, et guide de dépannage. Chaque rapport HTML inclut un lien direct vers cette documentation.


Conclusion

Un AD propre, c'est un AD plus sûr et plus facile à administrer. Ces scripts n'ont pas vocation à remplacer une solution comme DVLS ou un SIEM, mais ils couvrent les opérations de base que tout administrateur devrait automatiser.

Le projet est open source et disponible sur GitHub. N'hésitez pas à l'adapter à vos besoins.

Lien GitHub : https://github.com/SyNode-IT/PS-ManageInactiveAD


Tags : PowerShell, Active Directory, Windows Server 2022, Windows Server 2025, Sysadmin, Sécurité, Automation, Scripts