Comment puis-je trouver et déplacer un compte d'ordinateur Active Directory ?

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

Hey, Scripting Guy!

Bienvenue dans cette section TechNet, dans laquelle le Monsieur Script de Microsoft répond aux questions récurrentes sur les scripts d'administration système.

Question du jour : comment puis-je trouver et déplacer un compte d'ordinateur Active Directory ?

Comment puis-je trouver et déplacer un compte d'ordinateur Active Directory ?Comment puis-je trouver et déplacer un compte d'ordinateur Active Directory ?

S'il vous plaît Monsieur Script... Je dois déplacer un compte d'ordinateur d'une unité d'organisation vers une autre, mais je ne sais pas dans quelle unité d'organisation se trouve actuellement le compte d'ordinateur. Avez-vous une suggestion à me faire ?

-- AA

Bonjour AA. Vous savez, il existe un élément qui caractérise toutes les grandes rubriques de conseil telles que Chère Abby, Ann Landers ou encore S'il vous plaît Monsieur Script.... Il s'agit du fait que, à mesure que le temps passe, ces rubriques ont tendance à donner le même conseil. Quel que soit le nombre de messages envoyés par une même personne à Chère Abby pour se plaindre de ses problèmes de voisinage, vous savez pertinemment qu'elle ne va jamais lui conseiller de mettre feu à la maison du voisin. Il en va de même pour Ann Landers et pour S'il vous plaît Monsieur Script...

D'accord, il en va de même pour Ann Landers.

Nous savons qu'il nous arrive souvent de donner le même conseil en réponse à une question posée par un lecteur, et, aujourd'hui, nous ne dérogerons pas à cette règle. Voici donc la réponse : il s'agit d'un problème qui comporte deux parties, que nous allons analyser séparément. Juste une précision : l'une des parties implique une recherche dans Active Directory. Vous vous dites sûrement : combien de fois ai-je déjà entendu cela ! Mais ce qui compte, c'est que ça marche.

Comme vous l'avez probablement deviné, si l'une des parties implique une recherche dans Active Directory, l'autre concerne forcément le déplacement d'un ordinateur d'une unité d'organisation vers une autre. Comme cette opération est extrêmement facile, commençons par la traiter en premier. Voici un exemple de script qui déplace l'ordinateur atl-ws-01 de l'unité d'organisation Finance vers l'unité d'organisation Research :

Set objOU = GetObject("LDAP://OU=Research,DC=fabrikam,DC=com")
intReturn = objOU.MoveHere _
    ("LDAP://CN=atl-ws-01,OU=Finance,DC=fabrikam,DC=com", vbNullString)

En effet, deux lignes de code suffisent. Nous créons une liaison vers la nouvelle unité d'organisation (celle vers laquelle nous voulons déplacer l'ordinateur). Une fois la liaison créée, nous appelons la méthode MoveHere, en lui communiquant deux paramètres : l'ADsPath de l'ordinateur que nous voulons déplacer et vbNullString, une constante VBScript dont la valeur est Null. En transmettant Null comme second paramètre, nous indiquons à la méthode MoveHere que nous souhaitons que l'objet conserve son nom usuel actuel (atl-ws-01). Si nous lui avions communiqué un autre nom usuel, non seulement l'ordinateur aurait été déplacé, mais il aurait été également renommé.

En réalité, vous n'avez pas besoin d'inclure le paramètre Null. En effet, s'il n'existe pas de second paramètre, MoveHere considère qu'il s'agit du paramètre Null. Nous l'avons inclus ici juste pour que vous sachiez que MoveHere accepte deux paramètres.

Script supplémentaire : imaginons que vous souhaitez renommer un compte Active Directory. Vous devez alors créer une liaison vers l'unité d'organisation dans laquelle réside actuellement le compte, appeler la méthode MoveHere, puis attribuer au compte un autre nom usuel. Par exemple, le script suivant renomme l'ordinateur atl-ws-01 en finance-ws-01 :

Set objOU = GetObject("LDAP://OU=Finance,DC=fabrikam,DC=com")
intReturn = objOU.MoveHere _
    ("LDAP://CN=atl-ws-01,OU=Finance,DC=fabrikam,DC=com", "cn=finance-ws-01")

Vous avez raison, nous devrions facturer un supplément pour ces scripts, n'est-ce pas ?

Maintenant que nous savons comment déplacer un compte d'ordinateur, il ne nous reste plus qu'à le trouver. C'est ici qu'intervient notre script de recherche Active Directory. Ce script recherche, dans Active Directory, l'ordinateur nommé atl-ws-01 :

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 ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer' " & _
        "AND name='atl-ws-01'"
Set objRecordSet = objCommand.Execute

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

Le script précédent se limite à envoyer un écho du paramètre ADsPath de l'ordinateur. C'est bien, mais puisque nous disposons du paramètre AdsPath, autant aller plus loin et déplacer le compte d'ordinateur vers une autre unité d'organisation. (Souvenez-vous, AdsPath est le seul paramètre que nous devons communiquer à la méthode MoveHere, sauf si nous voulons renommer l'ordinateur.) Voici donc un script modifié qui trouve l'ordinateur atl-ws-01, puis le déplace de l'unité d'organisation Finance vers l'unité d'organisation Research :

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 ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer' " & _
        "AND name='atl-ws-01'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    strADsPath = objRecordSet.Fields("ADsPath").Value
    Set objOU = GetObject("LDAP://OU=Research,DC=fabrikam,DC=com")
    intReturn = objOU.MoveHere(strADsPath, vbNullString)
    objRecordSet.MoveNext
Loop

C'est aussi simple et aussi rapide que cela !

Vous remarquerez que nous n'avons pas expliqué le fonctionnement de la recherche dans Active Directory. Pour plus d'informations sur l'utilisation de scripts pour effectuer une recherche dans Active Directory, participez à la WebCast des Messieurs Script. site en anglais

Demain : comment faire pour mettre feu à la maison du voisin.

Attendez, ne brûlez la maison de personne, c'est juste une blague. Peut-être que dorénavant nous nous en tiendrons aux conseils sur les scripts…

Pour en savoir plus

Consultez les archives de S'il vous plaît Monsieur Script... site en anglais