19/09/2024

Active Directory

Ordinateurs inactifs : comment nettoyer l’Active Directory avec CleanupMonster ?

I. Présentation

L'Active Directory est un annuaire vivant et il est en quelque sorte le reflet de l'activité de l'entreprise et du cycle de vie des machines. Un nouvel arrivant peut être synonyme de l'achat d'une nouvelle machine, tandis qu'un départ peut être synonyme de la mise au placard d'une machine. Sans compter le renouvellement du parc informatique qui aura aussi des conséquences sur les objets présents dans l'annuaire Active Directory.

Ce constat implique de suivre l'activité des machines et de réserver un traitement spécifique à celles qui ne sont plus utilisées, voire même qui ne sont plus la propriété de l'entreprise. Autrement dit, il est essentiel de traquer les ordinateurs inactifs, car ils peuvent représenter un risque pour la sécurité du SI (un objet actif a des permissions auprès des services AD).

Cette action d'identification des ordinateurs inactifs et de nettoyage peut être menée à l'aide de PowerShell, et notamment le cmdlet "Search-ADAccount", évoqué dans ce chapitre de notre cours "Administrer l’Active Directory avec PowerShell" :

Ce cmdlet a un nombre de paramètres limités et il implique d'avoir une bonne maitrise de PowerShell afin de pouvoir être utilisé dans un script de nettoyage de l'Active Directory. La bonne nouvelle, c'est que ce travail peut être facilité grâce à un module PowerShell nommé "CleanupMonster".

CleanupMonster va pouvoir analyser votre annuaire Active Directory pour identifier les ordinateurs inactifs, selon différents critères. Vous pouvez l'utiliser seulement à des fins de reporting, mais aussi pour qu'il nettoie l'Active Directory de façon automatique. CleanupMonster peut désactiver les comptes des ordinateurs inactifs (et éventuellement les déplacer dans une OU), mais aussi les supprimer de l'annuaire AD. À chaque fois, il est possible de définir des critères différents pour ces trois actions (désactiver / déplacer / supprimer), ou d'en activer une mais pas l'autre.

CleanupMonster - Exemple d'exécution en mode interactif

Vous pouvez envisager un scénario comme celui-ci (le nombre de jours est ajustable à souhait) :

  • Désactiver un ordinateur après 60 jours d'inactivité
  • Déplacer un ordinateur dans une OU spécifique après 90 jours d'inactivité
  • Supprimer un ordinateur après 120 jours d'inactivité

Pour information, il s'agit d'un module créé par la société Evotec, au même titre que l'excellent GPOZaurr pour l'analyse de GPO et d'autres modules comme PSWriteHTML.

II. Installation de CleanupMonster

Commençons par l'installation du module à partir d'une console PowerShell :

Install-Module -Name CleanupMonster -Force -Verbose

Une fois que c'est fait, vous pouvez vous pencher sur son utilisation. Ce module contient une seule commande nommée "Invoke-ADComputersCleanup" et, d'après la documentation, il n'est pas nécessaire d'exécuter la commande en tant qu'administrateur. Par défaut, le domaine Active Directory autorise un utilisateur standard à lire les attributs LastLogonDate et LastPasswordSet.

Par la suite, le module peut être mis à jour via la commande suivante :

Update-Module -Name CleanupMonster

Voici le lien vers ce projet sur GitHub :

Voyons maintenant quelques exemples d'utilisation de ce module.

III. Utilisation de CleanupMonster

A. Identifier les ordinateurs inactifs

La première chose à faire, c'est d'exécuter la commande "Invoke-ADComputersCleanup" en mode audit, afin de générer un rapport uniquement. Autrement dit, aucune modification ne sera effectuée dans votre annuaire.

Invoke-ADComputersCleanup -WhatIf -ReportOnly -Disable -Delete -ShowHTML

Par défaut, l'outil identifie les machines dont les attributs "LastLogonDate" (dernière date de connexion) et "LastPasswordSet" (date de la dernière modification du mot de passe) n'ont pas été mis à jour depuis 180 jours (soit 6 mois).

Une fois l'analyse terminée, un rapport HTML s'ouvre de façon automatique (-ShowHTML). Il contient quelques graphes, avec le nombre de machines à désactiver et le nombre de machines à supprimer, selon les critères actuels. Il y a aussi une liste de tous les ordinateurs, avec un statut.

Voici comment identifier les ordinateurs inactifs à désactiver (utile si vous n'envisagez pas de les supprimer) :

Invoke-ADComputersCleanup -WhatIfDisable -ReportOnly -Disable -ShowHTML

Le paramètre "-WhatIf" sert à simuler l'exécution de la commande (ce qui est l'usage habituel du -WhatIf en PowerShell). Il y a différents paramètres avec le mot clé "WhatIf", ce qui peut permettre de réellement désactiver les ordinateurs inactifs et d'être en mode "audit" pour la suppression. De plus, le paramètre "-ReportOnly" indique de façon explicite que la commande va seulement générer un rapport sans toucher aux objets ordinateurs.

B. Désactiver et déplacer les ordinateurs inactifs

Si vous n'envisagez pas de supprimer les ordinateurs inactifs, mais simplement de les désactiver et les déplacer dans une OU spécifique de l'AD, voici la commande à exécuter :

Invoke-ADComputersCleanup -Disable -DisableAndMove -ShowHTML -DisableMoveTargetOrganizationalUnit "OU=Archivage,DC=it-connect,DC=local"

La commande ci-dessus va désactiver les comptes ordinateurs inactifs puis les déplacer dans l'OU "OU=Archivage,DC=it-connect,DC=local" (dans cet ordre). Il est essentiel de spécifier ensemble "-Disable -DisableAndMove" car "-DisableAndMove" n'est pas un mode à proprement parler.

Si vous souhaitez simplement désactiver les comptes sans les déplacer, utilisez cette syntaxe :

Invoke-ADComputersCleanup -Disable -ShowHTML

Retenez qu'il y a trois modes différents : désactiver (Disable), déplacer (Move) et supprimer (Delete). Quand un mode est spécifié, cela signifie qu'il est activé : par exemple, "-Disable" pour activer la désactivation des machines. Ces modes peuvent fonctionner ensemble et chaque mode contient ses propres paramètres dont le nom débute par le mot clé principal du mode (Disable / Move / Delete).

C. Exclure certaines machines de l'analyse

Il peut s'avérer utile d'exclure certains systèmes ou certaines machines de l'analyse de CleanupMonster, et ainsi s'assurer qu'ils ne seront pas affectés par le traitement. D'après mes tests, l'outil exclue automatiquement les contrôleurs de domaine, ce qui est une bonne chose.

Pour exclure les machines dont le système d'exploitation est Windows Server (toutes les versions) afin de ne pas les désactiver, vous devez spécifier le paramètre "-DisableExcludeSystems". Ensuite, précisez le système en tant que valeur, tout en sachant que vous pouvez spécifier le caractère wildcard ("*") car ce filtre s'appuie sur un "-Like". De plus, il y a le paramètre "-DeleteExcludeSystems" pour les exclusions sur la suppression.

Invoke-ADComputersCleanup -WhatIfDisable -ReportOnly -Disable -ShowHTML -DisableExcludeSystems "Windows Server*"

Mon annuaire Active Directory contient un objet ordinateur nommé "AZUREADSSOACC$", présent dans l'AD car la fonctionnalité SSO de Microsoft Entra ID est activée par l'intermédiaire de Entra Connect. Le problème, c'est que CleanupMonster m'indique qu'il va désactiver ce compte. D'où l'intérêt d'exécuter l'outil en mode audit afin de déclarer d'éventuelles exceptions avant qu'il passe réellement à l'action.

Dans ce cas, il convient d'ajouter le paramètre "-Exclusions" qui accepte une ou plusieurs valeurs, afin d'exclure cette machine. Il est aussi possible de jouer sur le paramètre "-Filter" pour injecter un filtre directement dans la commande "Get-ADComputer".

Invoke-ADComputersCleanup -Disable -DisableAndMove -ShowHTML -DisableExcludeSystems "Windows Server*" -Exclusions "AZUREADSSOACC$"

Nous obtenons bien le résultat escompté :

D. L'exécution dans une tâche planifiée

CleanupMonster est exécutable en mode interactif, comme nous venons de le faire, mais aussi par l'intermédiaire d'un script PowerShell qui sera exécuté dans une tâche planifiée.

Ce sera l'occasion de configurer l'outil selon vos besoins, en jouant sur les différents paramètres. Pour rappel, par défaut, CleanupMonster considère qu'un ordinateur est inactif quand il ne s'est pas connecté depuis 180 jours, mais ceci est ajustable avec les paramètres "DisableLastLogonDateMoreThan" et "DisablePasswordLastSetMoreThan".

Voici un exemple de script récupéré à partir du GitHub du projet et destiné à l'exécution dans une tâche planifiée. Il s'appuie sur une hash table de paramètres.

# Run the script
$Configuration = @{
    Disable                        = $true
    DisableNoServicePrincipalName  = $null
    DisableIsEnabled               = $true
    DisableLastLogonDateMoreThan   = 90
    DisablePasswordLastSetMoreThan = 90
    DisableExcludeSystems          = @(
        # 'Windows Server*'
    )
    DisableIncludeSystems          = @()
    DisableLimit                   = 2 # 0 means unlimited, ignored for reports
    DisableModifyDescription       = $false
    DisableModifyAdminDescription  = $true

    Delete                         = $true
    DeleteIsEnabled                = $false
    DeleteNoServicePrincipalName   = $null
    DeleteLastLogonDateMoreThan    = 180
    DeletePasswordLastSetMoreThan  = 180
    DeleteListProcessedMoreThan    = 90 # 90 days since computer was added to list
    DeleteExcludeSystems           = @(
        # 'Windows Server*'
    )
    DeleteIncludeSystems           = @(

    )
    DeleteLimit                    = 2 # 0 means unlimited, ignored for reports

    Exclusions                     = @(
        '*OU=Domain Controllers*'
        '*OU=Servers,OU=Production*'
        'EVOMONSTER$'
        'EVOMONSTER.AD.EVOTEC.XYZ'
    )

    Filter                         = '*'
    WhatIfDisable                  = $true
    WhatIfDelete                   = $true
    LogPath                        = "$PSScriptRoot\Logs\DeleteComputers_$((Get-Date).ToString('yyyy-MM-dd_HH_mm_ss')).log"
    DataStorePath                  = "$PSScriptRoot\DeleteComputers_ListProcessed.xml"
    ReportPath                     = "$PSScriptRoot\Reports\DeleteComputers_$((Get-Date).ToString('yyyy-MM-dd_HH_mm_ss')).html"
    ShowHTML                       = $true
}

# Exécution de la tâche
$Output = Invoke-ADComputersCleanup @Configuration
$Output

Ensuite, enregistrez ce script et exécutez-le en tant qu'action dans une tâche planifiée Windows.

powershell.exe -File "C:\chemin\vers\script\CleanupMonster.ps1"

E. Les paramètres supplémentaires

CleanupMonster contient de très nombreux paramètres et il est très flexible. De ce fait, ce tutoriel ne pourra pas couvrir tous les scénarios.

Voici quelques commandes pour vous aider :

# Obtenir une aide complète
Get-Help Invoke-ADComputerCleanup -Full

# Obtenir une liste d'exemples :
Get-Help Invoke-ADComputerCleanup -Examples

# Obtenir de l'aide sur un paramètre spécifique :
Get-Help Invoke-ADComputerCleanup -Parameter Delete

J'attire votre attention sur le fait que CleanupMonster peut se connecter à Azure et Intune pour consulter l'activité récente d'une machine. En effet, un ordinateur ne s'est pas connecté récemment à l'annuaire AD, mais peut-être qu'il s'est synchronisé à Intune (dans le cas où vous utilisez ce MDM). Ceci implique d'utiliser en complément le module PowerShell GraphEssentials pour établir une connexion au tenant et l'interroger.

Il y a plusieurs paramètres pour effectuer cette vérification, notamment ces deux-là :

.PARAMETER DisableLastSeenAzureMoreThan
    Disable computer only if it Last Seen in Azure is more than the specified number of days.
    Please note that you need to make connection to Azure using Connect-MgGraph with proper permissions first.
    Additionally you will need GraphEssentials PowerShell Module installed.

.PARAMETER DisableLastSeenIntuneMoreThan
    Disable computer only if it Last Seen in Intune is more than the specified number of days.
    Please note that you need to make connection to Intune using Connect-MgGraph with proper permissions first.
    Additionally you will need GraphEssentials PowerShell Module installed.

Vous pouvez aussi consulter cette page pour avoir la liste et la description des paramètres.

IV. Conclusion

Désormais, vous disposez d'un outil flexible et aboutit pour effectuer un suivi des ordinateurs inactifs dans votre annuaire Active Directory ! L'exécution par tâche planifiée est un plus afin d'automatiser cette action de maintenance indispensable.

Note : si vous rencontrez des erreurs avec le mode interactif, il est recommandé de passer plutôt par un script PS1 et de tester avec le paramètre "-DontWriteToEventLog". Veillez à maintenir à jour le module CleanupMonster mais aussi PSEventViewer et PSWriteHTML.

Qu'en pensez-vous ?

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.