Bonjour,
Inspiré d'un code sur le net
J'ai écris le code suivant qui fonctionne très bien.

'Trouver le nombre de poste dans l'AD

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
option explicit
	 Dim ObjNetwork, ObjWinNT, ObjDomaine, Nom, Domaine, i
	 i=0
	 ' Recuperer le nom de domaine
	 set ObjNetwork=WScript.CreateObject("Wscript.Network")
	 Domaine=objNetwork.UserDomain
 
	 'Ouvrir le fournisseur WinNT (respectez la casse).
     set ObjWinNT=GetObject("WinNT://" & Domaine)
 
     For each ObjDomaine in ObjWinNT
		If lcase(ObjDomaine.class)="computer" then
			Nom = ObjDomaine.Name
			'compter les computers qui commencent par
			If  lcase(Mid(Nom, 1,2))="al" or lcase(Mid(Nom, 1,2))="ca"  or lcase(Mid(Nom, 1,2))="cp" or lcase(Mid(Nom, 1,2))="fo" _
				or lcase(Mid(Nom, 1,2))="gu" or lcase(Mid(Nom, 1,2))="in" or lcase(Mid(Nom, 1,2))="jf" or lcase(Mid(Nom, 1,2))="jp" _ 
				or lcase(Mid(Nom, 1,2))="mj" or lcase(Mid(Nom, 1,2))="mp" or lcase(Mid(Nom, 1,2))="mt" or lcase(Mid(Nom, 1,2))="ne" _
				or lcase(Mid(Nom, 1,1))="p" or lcase(Mid(Nom, 1,2))="re" or lcase(Mid(Nom, 1,2))="sa" or lcase(Mid(Nom, 1,2))="st"  _
				or lcase(Mid(Nom, 1,2))="tg" or lcase(Mid(Nom, 1,2))="ti" or lcase(Mid(Nom, 1,2))="tl" or lcase(Mid(Nom, 1,2))="tp" then	
				i=i+1
		End If
     End If
     Next
	 wscript.echo I

P.S: le fournisseur WINNT ne reconnait pas les OU


Voilà comment parcourir les OU, bon ici c'est pour compter les postes, avec LDAP.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Set ObjRootDSE = GetObject("LDAP://RootDSE")
strDomainPath = ObjRootDSE.Get("DefaultNamingContext")
Set adsUsers = GetObject("LDAP://" & strDomainPath)
Dim i 
i = 0
adsUsers.Filter = Array("organizationalUnit")
EnumOUs(adsUsers)
Set adsUsers = GetObject("LDAP://cn=computers," & strDomainPath)
EnumOUs(adsUsers)
wscript.echo i
 
 
'Permet de parcourir toutes les OU
Sub EnumOUs(objParent)
 
	On Error Resume Next
	objParent.Filter = Array("Computer")
 
	For Each objUser in objParent
		If objUser.Class = "computer" Then
               'Mettre dans la variable name le nom de l'ou à partir du 4em caractere pour eviter d'avoir "OU="
		Name = Mid(objUser.name,4)
                        'Compte les ordi commençant par les lettres suivantes
			if  lcase(Mid(Name, 1,2))="al" or lcase(Mid(Name, 1,2))="ca"  or lcase(Mid(Name, 1,2))="cp" or lcase(Mid(Name, 1,2))="fo" _
				or lcase(Mid(Name, 1,2))="gu" or lcase(Mid(Name, 1,2))="in" or lcase(Mid(Name, 1,2))="jf" or lcase(Mid(Name, 1,2))="jp" _ 
				or lcase(Mid(Name, 1,2))="mj" or lcase(Mid(Name, 1,2))="mp" or lcase(Mid(Name, 1,2))="mt" or lcase(Mid(Name, 1,2))="ne" _
				or lcase(Mid(Name, 1,1))="p" or lcase(Mid(Name, 1,2))="re" or lcase(Mid(Name, 1,2))="sa" or lcase(Mid(Name, 1,2))="st"  _
				or lcase(Mid(Name, 1,2))="tg" or lcase(Mid(Name, 1,2))="ti" or lcase(Mid(Name, 1,2))="tl" or lcase(Mid(Name, 1,2))="tp" then	
				i=i+1
			end if
		End If
	Next
 
	objParent.Filter = Array("organizationalUnit")
 
	For Each objChild In objParent
		EnumOUs(objChild)
	Next
 
End Sub
La 2em ligne permet de compter les PC dans computers qui n'est pas consideré comme une ou.Et ensuite on rappelle la procedure.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Set adsUsers = GetObject("LDAP://cn=computers," & strDomainPath)
EnumOUs(adsUsers)
P.S: attention Domain controller est compté comme une OU. il faut mettre une condition si on ne veut pas parcourir certaines OU.


Sur ADO c'est plus simple
En esperant que ca aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Option Explicit
 
Dim ObjRootDSE
Dim adoConnexion
Dim AdoRecordset
Dim strDomainPath,Requete,i,Nom
 
Set ObjRootDSE = GetObject("LDAP://RootDSE")
'Obtenir le nom LDAP sous forme dc=mondomaine,dc=com dans la variable StrDomainPath
StrDomainPath = ObjRootDSE.Get("DefaultNamingContext")
wscript.echo strDomainPath
 
'Creer un objet de connexion ADO qu'on nommera ADOconnexion
Set adoConnexion = WScript.CreateObject("ADODB.Connection")
'Comme le fournisseur par defaut de ADO est MSDASQL il faut lui preciser un autre fournisseur ADsDSOObject qui offrira une syntaxe ADSI
adoConnexion.Provider = "ADsDSOObject"
'Ensuite avec la methode Open on va ouvrir la connexion sur l'AD. On peut specifier 3 parametres. 1er parametre connexion source "Active Directory Provider", les 2 autres sont l'utilisateur sous forme cn=...,dc=...etc et le mot de passe.
'On aurait pu aussi ecrire adoConnexion.Open "Active Directory Provider"
adoConnexion.Open
'Verification de la connexion
	If adoConnexion.State = 1 Then
		WScript.Echo "Connexion avec AD etablie"
	Else
		WScript.Echo "Pas de connexion à l'AD"
		WScript.Quit
	End If
	'on inscrit dans une variable, ici requete, la commande à executer. 4 parametres  separer par des points virgules(adresse LDAP  OU=...,DC=mondomaine,DC=com;l'objet cherché;les champs dans cet objet;et l'etendue de la recherche (Base ou OneLevel ou SubTree(pour tous les niveaux)	
	Requete="<LDAP://" & strDomainPath & ">;(Objectclass=computer);Name;Subtree"
    'Alimentation du Recordset 	
	Set adoRecordset = adoConnexion.Execute (Requete)
	'Lecture du Recordset
	While Not adoRecordset.EOF
		Nom=adoRecordset.Fields.Item("Name").Value
		If  lcase(Mid(Nom, 1,2))="al" or lcase(Mid(Nom, 1,2))="ca"  or lcase(Mid(Nom, 1,2))="cp" or lcase(Mid(Nom, 1,2))="fo" _
				or lcase(Mid(Nom, 1,2))="gu" or lcase(Mid(Nom, 1,2))="in" or lcase(Mid(Nom, 1,2))="jf" or lcase(Mid(Nom, 1,2))="jp" _ 
				or lcase(Mid(Nom, 1,2))="mj" or lcase(Mid(Nom, 1,2))="mp" or lcase(Mid(Nom, 1,2))="mt" or lcase(Mid(Nom, 1,2))="ne" _
				or lcase(Mid(Nom, 1,1))="p" or lcase(Mid(Nom, 1,2))="re" or lcase(Mid(Nom, 1,2))="sa" or lcase(Mid(Nom, 1,2))="st"  _
				or lcase(Mid(Nom, 1,2))="tg" or lcase(Mid(Nom, 1,2))="ti" or lcase(Mid(Nom, 1,2))="tl" or lcase(Mid(Nom, 1,2))="tp" then	
				i=i+1
		End If
		'Passer à l'enregistrement suivant
		adoRecordset.MoveNext
	Wend
	wscript.echo i
	'Fermer les connexions
	adoRecordset.Close
	adoConnexion.Close
Voilà je crois avoir repertorier les 3 façons de parcourir l'Active Directory.

Fournisseur WinNT : Pas de reconnaissance de hierachie.
Requete ADO: Seulement en lecture
LDAP: Permet de parcourir et eventuellement de modifier.

Bon Courage à tous!!!