Comment puis-je savoir à quelle unité d'organisation appartient un compte d'utilisateur ?

S'il vous plaît Docteur Script...

Hey, Scripting Guy!

Bienvenue dans cette nouvelle section TechNet, dans laquelle le Docteur Script de Microsoft répond aux questions récurrentes sur les scripts d'administration système. Vous avez une question sur les scripts d'administration système ?

Question du jour : comment puis-je savoir à quelle unité d'organisation appartient un compte d'utilisateur ?

Comment puis-je savoir à quelle unité d'organisation appartient un compte d'utilisateur ?Comment puis-je savoir à quelle unité d'organisation appartient un compte d'utilisateur ?

S'il vous plaît Docteur Script... Comment puis-je savoir à quelle unité d'organisation appartient un compte d'utilisateur ?

-- CO

Bonjour CO. Ah, oui, je vois. Je devine que vous imaginez qu'il existe probablement une propriété quelconque dans Active Directory qui permet d'obtenir cette information et qu'il suffit d'extraire sa valeur.

Cela semble tellement évident que, comme vous pouvez vous en douter, il n'existe aucune propriété ni aucun élément de la sorte dans Active Directory. Mais, ne vous en faites pas. Cela ne veut pas dire que nous ne pouvons pas déterminer l'unité d'organisation (OU) d'un utilisateur. C'est juste que la procédure est un peu plus compliquée que ça.

Nous partons du principe, ici, que vous ne connaissez pas le nom unique de l'utilisateur. En effet, avec un nom unique tel que CN=kenmyer,OU=Finance,DC-fabrikam,DC=com, même Docteur Script peut deviner à quelle unité d'organisation appartient l'utilisateur ! Nous dirons donc que vous ne connaissez que son nom de compte SAM, c'est-à-dire le nom avec lequel, généralement, il se connecte au domaine.

Si vous connaissez le nom de compte SAM, vous avez de la chance. Ces noms doivent être uniques dans la forêt d'Active Directory. Nous pouvons donc trouver cet utilisateur en faisant une recherche dans Active Directory :

On Error Resume Next

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

objCommand.CommandText = _
    "SELECT distinguishedName FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
        "AND sAMAccountName='kenmyer'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    Wscript.Echo objRecordSet.Fields("distinguishedName").Value
    objRecordSet.MoveNext
Loop

Comme nous l'avons déjà vu, les recherches dans Active Directory sont assez laborieuses, même si le script n'est pas si long ni si compliqué que ça. Pour plus d'informations, participez à la Webcast des Messieurs Script.

Sans rentrer dans le détail, dans ce script, nous avons recherché, dans le domaine fabrikam.com, l'utilisateur possédant le nom de compte SAM (attribut sAMAccountName) kenmyer. Une fois que nous l'avons trouvé, nous avons renvoyé son nom unique (attribut distinguishedName). Le résultat se présentant sous la forme CN=kenmyer,OU=Finance,DC=fabrikam,DC=com, il est facile de déterminer l'unité d'organisation de l'utilisateur.

En réalité, nous sommes trop fainéants pour rechercher l'unité d'organisation dans le nom unique de l'utilisateur. Nous voulons que le script le fasse pour nous. Alors, modifions notre boucle « Do » comme suit :

Do Until objRecordSet.EOF
    strDN = objRecordSet.Fields("distinguishedName").Value
    arrPath = Split(strDN, ",")
    intLength = Len(arrPath(1))
    intNameLength = intLength - 3
    Wscript.Echo Right(arrPath(1), intNameLength)
    objRecordSet.MoveNext
Loop

Aïe ! Pas de panique, nous allons vous expliquer. Ici aussi, nous commençons par obtenir le nom unique de l'utilisateur. Comme vous le savez, il va ressembler à CN=kenmyer,OU=Finance,DC=fabrikam,DC=com.

Nous stockons cette valeur dans la variable strPath, puis nous utilisons la commande Split de VBScript pour subdiviser strPath en plusieurs éléments d'un tableau. Lorsque nous utilisons la commande Split pour réaliser la subdivision à chaque virgule (c'est-à-dire que nous indiquons que la virgule est notre délimiteur, le caractère qui sépare chaque élément de la chaîne), nous obtenons un tableau se présentant comme suit :

CN=kenmyer 
OU=Finance
DC=fabrikam
DC=com

Nous savons que le deuxième élément du tableau (qui, d'ailleurs, possède toujours le numéro d'index 1) correspond à l'unité d'organisation dans laquelle réside le compte d'utilisateur. Cela signifie que, pour obtenir le nom de l'unité d'organisation, il suffirait de prendre le deuxième élément (arrPath(1)) et d'enlever OU=.

Est-ce possible ? Bien sûr. La fonction Len permet de déterminer le nombre de caractères de l'élément 0 d'un tableau. La valeur étant OU=Finance, le nombre de caractères est donc de 10.

De ce nombre, il faut soustraire 3. Pourquoi ? Parce que nous voulons retirer OU=, et OU= présente trois caractères. Nous obtenons donc 7 caractères. Nous savons donc maintenant que le nom de l'unité d'organisation, en l'occurrence, Finance, possède 7 caractères.

Enfin, nous utilisons la fonction Right pour extraire les 7 derniers caractères de la chaîne. En d'autres termes, nous commençons au e de OU=Finance et remontons de 7 caractères. Et puis ? Ça y est, les 7 caractères de OU=Finance s'avèrent être Finance, le nom de l'unité d'organisation dans laquelle réside le compte d'utilisateur. Nous y sommes parvenus !

Voici le script corrigé qui effectue une recherche dans Active Directory et renvoie l'unité d'organisation dans laquelle réside le compte d'utilisateur.

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

objCommand.CommandText = _
    "SELECT distinguishedName FROM 'LDAP://dc=fabrikam,dc=com' " & _
        "WHERE objectCategory='user' " & _
            "AND sAMAccountName='kenmyer'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    strDN = objRecordSet.Fields("distinguishedName").Value
    arrPath = Split(strDN, ",")
    intLength = Len(arrPath(1))
    intNameLength = intLength - 3
    Wscript.Echo Right(arrPath(1), intNameLength)
    objRecordSet.MoveNext
Loop
Pour en savoir plus

Consultez les archives de S'il vous plaît Docteur Script...