Comment puis-je obtenir la liste de tous les contrôleurs de domaine de mon domaine ?

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 obtenir la liste de tous les contrôleurs de domaine de mon domaine ?

Comment puis-je obtenir la liste de tous les contrôleurs de domaine de mon domaine ?Comment puis-je obtenir la liste de tous les contrôleurs de domaine de mon domaine ?

S'il vous plaît Monsieur Script... Est-il possible d'obtenir la liste de tous les contrôleurs de domaine de mon domaine ?

-- KT

Bonjour KT. En réalité, il existe au moins deux façons d'obtenir la liste de tous les contrôleurs de domaine de votre domaine. La première est relativement simple, mais peu fiable. Certaines configurations d'Active Directory ignorent une partie des contrôleurs de domaine. La seconde méthode est légèrement plus compliquée, mais, mis à part quelques circonstances imprévues, renvoie toujours la liste de tous vos contrôleurs de domaine.

Voyons d'abord la méthode la plus simple. Par défaut, le compte d'ordinateur Active Directory d'un contrôleur de domaine est stocké dans l'unité d'organisation Contrôleurs de domaine. Si c'est bien là que tous vos comptes de contrôleurs de domaine sont stockés, il vous suffit alors d'énumérer les comptes d'ordinateurs de cette unité d'organisation pour obtenir la liste que vous recherchez :

Set objOU = GetObject("LDAP://ou=Domain Controllers, dc=fabrikam, dc=com")
objOU.Filter = Array("Computer")
For Each objComputer in objOU
    Wscript.Echo objComputer.CN
Next

Le script précédent établit une liaison avec l'unité d'organisation Contrôleurs de domaine et applique un filtre pour garantir que seuls les comptes d'ordinateurs sont renvoyés. Une simple boucle For Each nous permet ensuite de parcourir les différents comptes d'ordinateurs répertoriés, en renvoyant l'écho du nom usuel (CN, Common Name) de chacun.

Alors, quel est le problème ? Il se peut que ce script ne pose aucun problème. Cependant, si certains comptes de contrôleurs de domaine sont situés ailleurs dans Active Directory, ce script ne donnera pas les résultats escomptés. De même, si certains comptes d'ordinateurs (comme ceux des serveurs membres) font partie de l'unité d'organisation Contrôleurs de domaine, ce script les identifiera par erreur comme étant des contrôleurs de domaine. Cela s'explique par le fait que le script ne fait que rechercher des comptes d'ordinateurs.

Par conséquent, quel est le moyen le plus sûr d'obtenir la liste de tous vos contrôleurs de domaine ? Eh bien, si vous êtes un lecteur assidu de S'il vous plaît Monsieur Script..., il est donc probable que vous ayez déjà trouvé la réponse : rechercher dans Active Directory.

D'accord, vous devez penser que « Rechercher dans Active Directory » est notre réponse standard à toutes vos questions. Mais vous savez pertinemment qu'Active Directory est une véritable mine d'informations et qu'il est logique d'y rechercher les réponses à nos questions. Vous souhaitez avoir la liste de tous les contrôleurs de domaine d'un domaine spécifique ? Alors exécutez ce script :

On Error Resume Next

Const ADS_SCOPE_SUBTREE = 2

Set objRootDSE = GetObject("LDAP://RootDSE")
strConfigurationNC = objRootDSE.Get("configurationNamingContext")

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://" & strConfigurationNC & "' WHERE objectClass='nTDSDSA'"  
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    Set objParent = GetObject(GetObject(objRecordset.Fields("ADsPath")).Parent)
    WScript.Echo objParent.CN
    objRecordSet.MoveNext
Loop

Il est vrai que ce script est un peu plus compliqué, mais il fonctionne correctement et renvoie tous les contrôleurs de domaine quel que soit l'emplacement de leurs comptes Active Directory. Le script commence par établir une liaison avec RootDSE, puis se connecte au contexte d'attribution de nom de configuration du domaine. (Le contexte d'attribution de nom de configuration – ou partition d'annuaire de configuration – détient des informations d'ordre général. Vous y trouvez, par exemple, la configuration par défaut et les informations de stratégie relatives à toutes les instances d'un service donné au sein de la forêt.)

À partir d'ici, nous effectuons une recherche type dans Active Directory : nous souhaitons obtenir l'ADsPath pour tous les objets nTDSDSA inclus dans le contexte d'attribution de nom de configuration. Pour les besoins de notre recherche, nTDSDSA est un raccourci (de manière détournée) de Directory System Agent (Agent de système d'annuaire), le logiciel chargé, entre autres, de garantir l'accès au service d'annuaire. Ce rôle est, bien évidemment, identique à celui d'un contrôleur de domaine.

Notez cependant qu'une liste de tous les objets nTDSDSA est différente d'une liste de tous les contrôleurs de domaine. L'ADsPath associé à un objet TDSDSA nous indique comment trouver cet objet dans Active Directory. En revanche, il ne nous indique pas le nom de l'ordinateur sur lequel cet objet est installé (ni que, si vous avez installé l'objet nTDSDSA, vous devez être un contrôleur de domaine). Pour déterminer le nom de l'ordinateur, il existe cette ligne de code un peu bizarre :

Set objParent = GetObject(GetObject(objRecordset.Fields("ADsPath")).Parent)

En fait, il s'agit d'établir d'abord une liaison avec un objet nTDSDSA, puis, immédiatement après, une liaison avec le Parent de cet objet. Dans le cas de l'objet nTDSDSA, l'objet Parent est l'ordinateur lui-même. En d'autres termes, en créant une liaison avec le Parent nTDSDSA, nous sommes liés au compte d'ordinateur (qui, souvenez-vous, doit être un contrôleur de domaine, sinon il n'aurait pas l'objet nTDSDSA). À ce stade, nous avons enfin atteint un contrôleur de domaine et il ne nous reste plus qu'à renvoyer l'écho du nom usuel de cet ordinateur. Pour terminer, nous répétons la boucle pour tous les objets nTDSDSA et, par extension, pour tous les contrôleurs de domaine du domaine.

Pour en savoir plus

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