Gérer les utilisateurs et ordinateurs inactifs dans l’Active Directory

I. Présentation

Un annuaire Active Directory est vivant : il évolue au rythme des arrivées et des départs dans l'entreprise, mais il est également lié à votre parc machine puisqu'elles seront probablement intégrées au domaine.

Par conséquent, l’annuaire contient des comptes utilisateurs et ordinateurs plus utilisés mais actifs (au niveau annuaire), ces comptes doivent être gérés et ne pas être laissés en l’état.

L’ANSSI recommande d’appliquer les règles suivantes pour la gestion des comptes inactifs :

  • Définir une politique de désactivation automatique des comptes non utilisés pendant un certain laps de temps
  • Conserver les comptes désactivés et inutilisés afin d’avoir un historique des comptes utilisateurs au sein du système d’information
  • Placer les comptes désactivés dans une unité d’organisation (« OU ») spécifique
  • Retirer les droits et privilèges des comptes désactivés

II. Comment rechercher les utilisateurs et ordinateurs inactifs ?

Le cmdlet "Search-ADaccount" va permettre assez facilement de rechercher les objets inactifs au sein de l'annuaire, que ce soit les ordinateurs ou les utilisateurs. Le paramètre Timespan sert à indiquer un nombre de jours, par exemple si l'on indique 180 jours, cela correspond à 6 mois, et la requête nous retournera les objets inactifs depuis au moins 180 jours.

Mais au fait, qu'entendons-nous par inactif ? Lorsqu'un utilisateur ou un ordinateur réalise une connexion auprès d'un contrôleur de domaine, cela actualise l'attribut LastLogon de l'objet. La valeur de cet attribut correspond à la date de dernière connexion de l'utilisateur/ordinateur auprès d'un contrôleur de domaine.

  • Pour rechercher les comptes utilisateurs inactifs depuis 180 jours :
Search-ADaccount -UsersOnly -AccountInactive -Timespan 180
  • Pour rechercher les comptes utilisateurs inactifs depuis 180 jours :
Search-ADaccount -ComputersOnly -AccountInactive -Timespan 180

Remarque : les comptes qui ne se sont jamais connectés seront considérés comme étant inactifs, même si le compte vient d'être créé.

Il se peut que cette commande indique certains comptes built-in comme étant inactifs, par exemple le compte "Invité" ou le compte "krbtgt" qui sert à distribuer les tickets Kerberos. Pour éviter une mésaventure, il peut être intéressant d'exclure de la recherche l'OU "Users". Ce qui nous donne :

Search-ADaccount -UsersOnly -AccountInactive -Timespan 180 | Where{ $_.DistinguishedName -notmatch "CN=Users" }

Ah oui, au fait, j'allais oublier : nous allons ajouter une autre condition dans la clause Where pour récupérer uniquement les comptes activés dans l'annuaire. Sinon, les utilisateurs seront traités à chaque fois que le script s'exécute. Voici la commande mise à jour :

Search-ADaccount -UsersOnly -AccountInactive -Timespan 180 | Where{ ($_.DistinguishedName -notmatch "CN=Users") -and ($_.Enabled -eq $true) }

III. Retirer l'utilisateur des groupes dont il est membre

Maintenant que nous sommes en capacité de récupérer la liste des objets inactifs, nous devons le supprimer des groupes auxquels il appartient. Prenons l'exemple d'un utilisateur nommé "une-comptable-01" et qui appartient à deux groupes : "Comptabilité" et "Utilisateurs du domaine". Nous allons lui laisser seulement le groupe par défaut (Utilisateurs du domaine).

Commençons par stocker le SamAccountName de l'utilisateur dans une variable :

$SamAccountName "ma-comptable-01"

Puis, nous allons le retirer des groupes :

Get-AdPrincipalGroupMembership -Identity $SamAccountName | Where-Object { $_.Name -Ne "Utilisateurs du domaine" } | Remove-AdGroupMember -Members $SamAccountName -Confirm:$false

Nous ne demanderons pas de confirmation pour plus de simplicité. Le tour est joué pour cette partie 🙂

IV. Désactiver l'utilisateur et le déplacer

Pour désactiver ce même utilisateur, nous allons utiliser la commande suivante :

Set-ADUser -Identity $SamAccountName -Enabled:$false -Description "Désactivé le $(Get-Date -Format dd/MM/yyyy)"

Dans l'attribut "description" nous allons indiquer la date afin d'avoir une traçabilité 👍

La dernière étape consiste à déplacer l'utilisateur dans une unité d'organisation dédiée aux comptes archivés / inactifs. Avec le cmdlet Move-ADObject, nous allons utiliser le DistinguishedName de l'utilisateur, via la variable $DN. Cette valeur sera récupérée automatiquement dans le script final.

Par exemple :

$DN = "CN=Une Comptable,OU=Personnel,DC=IT-CONNECT,DC=LOCAL"

On déplace l'utilisateur vers l'OU "OU=Archivage,DC=IT-CONNECT,DC=LOCAL" :

Move-ADObject -Identity "$DN" -TargetPath "OU=Archivage,DC=IT-CONNECT,DC=LOCAL"

V. Script de gestion des comptes inactifs

Maintenant que nous avons vu les différentes actions traduites en commandes PowerShell, on peut regrouper tout cela dans un script. Afin d'avoir un seul script qui gère aussi bien les ordinateurs que les utilisateurs inactifs, il faut penser à ne pas indiquer UsersOnly ou ComputersOnly dans la commande Search-ADAccount.

Il faut également adapter certaines commandes, en fonction de s'il s'agit un objet utilisateur ou ordinateur à traiter. Pour cela, on va se baser sur l'attribut ObjectClass qui nous indique si l'objet est de type user ou computer.

$InactivesObjects = Search-ADaccount -AccountInactive -Timespan 180 | Where{ ($_.DistinguishedName -notmatch "CN=Users") -and ($_.Enabled -eq $true) }

Foreach($Object in $InactivesObjects){

  $SamAccountName = $Object.SamAccountName
  $DN = $Object.DistinguishedName
  $ObjectClass = $Object.ObjectClass

  Write-Output "L'objet $SamAccountName est inactif !"

# Si c'est un utilisateur...
if($ObjectClass -eq "user"){

  # Retirer l'utilisateur des groupes (sauf "Utilisateurs du domaine")
  Get-AdPrincipalGroupMembership -Identity $SamAccountName | Where-Object { $_.Name -Ne "Utilisateurs du domaine" } | Remove-AdGroupMember -Members $SamAccountName -Confirm:$false -ErrorVariable ClearObject

  # Désactiver l'utilisateur
  Set-ADUser -Identity $SamAccountName -Enabled:$false -Description "Désactivé le $(Get-Date -Format dd/MM/yyyy)" -ErrorVariable +ClearObject

# Sinon, si c'est un ordinateur...
}elseif($ObjectClass -eq "computer"){

  # Retirer l'ordinateur des groupes (sauf "Ordinateurs du domaine")
  Get-AdPrincipalGroupMembership -Identity $SamAccountName | Where-Object { $_.Name -Ne "Ordinateurs du domaine" } | Remove-AdGroupMember -Members $SamAccountName -Confirm:$false -ErrorVariable ClearObject

  # Désactiver l'ordinateur
  Set-ADComputer -Identity $SamAccountName -Enabled:$false -Description "Désactivé le $(Get-Date -Format dd/MM/yyyy)" -ErrorVariable +ClearObject
}

# Déplacer l'utilisateur/ordinateur
Move-ADObject -Identity "$DN" -TargetPath "OU=Archivage,DC=IT-CONNECT,DC=LOCAL" -ErrorVariable +ClearObject

if($ClearUser){
  Write-Output "ERREUR ! objet concerné : $SamAccountName ($ObjectClass)"
}else{
  Write-Output "Traitement de l'objet $SamAccountName de type $ObjectClass avec succès ! :-)"
}
  Clear-Variable ClearUser
}

Voilà, ne reste plus qu'à améliorer ce bout de code 😉

En espérant que ces commandes et conseils vous seront utiles ! N'hésitez pas à partager votre retour d'expérience dans la gestion des objets inactifs.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian B.

Consultant chez Délibérata le jour, blogueur pour IT-Connect la nuit, 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.

florian has 2279 posts and counting.See all posts by florian

3 pensées sur “Gérer les utilisateurs et ordinateurs inactifs dans l’Active Directory

  • Merci pour cet article, il va m’être très utile. ^^

    Répondre
  • Super tuto par contre je pense qu’il manque des  »  » au niveau du timespam :
    -Timespan 180 il faut renseigner: -Timespan « 180 » les valeurs retournées sont différentes.
    A confirmer

    Répondre

Laisser un commentaire

Votre adresse de messagerie 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.