Vérifier dans l’AD les comptes verrouillés

Dans l’AD de Micro$oft, il n’y a pas d’objet spécifique pour gérer l’état actif/inactif d’un compte.
On peut le manipuler via l’interface de la console ADUC, mais ça n’apparaît pas directement dans la console ADSI Edit.

En fait, c’est géré dans le champ userAccountControl en hexadécimal (dans la console ADSI edit). Et c’est le deuxième bit, soit la valeur 2. A 0 le compte est actif, à 1 il est inactif. Il faut donc l’extraire ou l’injecter en hexa au bon endroit…
Pfu :-(

L’extraction :

$code = "Toto"
$ldapquery = "LDAP://CN=" + $code + ",OU=Users,DC=example,DC=lan"

L’objet retourné contient toutes les infos sur le compte. Le champ UserAccountControl est visible comme un nombre affiché en décimal. Dans la console ADSI edit, il est affiché en tant que nombre en hexadécimal. Sauf que c’est un objet de type System.DirectoryServices.PropertyValueCollection et non un System.Int32 . Et, évidement, impossible de convertir cette valeur en hexa tagué objet AD en « nombre » hexa… Il faut passer par l’état « string » pour ensuite le convertir en nombre. Et enfin on peut faire dessus des opérations booléennes :

([int]([string](([ADSI]$ldapquery).UserAccountControl)) -band 0x2) -eq 0

Il y a une autre méthode plus longue mais moins tordu :

$ldapuser = [ADSI]$ldapquery
($ldapuser.Get('UserAccountControl') -band 0x2) -eq 0

Et pour écrire, deux cas. Le premier, on désactive inconditionnellement un code (bit 2 à 1) :

$ldapuser = [ADSI]$ldapquery
$ldapuser.Put('UserAccountControl',($ldapuser.Get('UserAccountControl') -bor 0x2))
$ldapuser.SetInfo()

Le deuxième cas, on active inconditionnellement le code (bit 2 à 0) :

$ldapuser = [ADSI]$ldapquery
$ldapuser.Put('UserAccountControl',($ldapuser.Get('UserAccountControl') -band 0x7ffffffd))
$ldapuser.SetInfo()

Et voila :-)