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.
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
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
P.S: attention Domain controller est compté comme une OU. il faut mettre une condition si on ne veut pas parcourir certaines OU.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Set adsUsers = GetObject("LDAP://cn=computers," & strDomainPath) EnumOUs(adsUsers)
Sur ADO c'est plus simple
En esperant que ca aide.
Voilà je crois avoir repertorier les 3 façons de parcourir l'Active Directory.
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
Fournisseur WinNT : Pas de reconnaissance de hierachie.
Requete ADO: Seulement en lecture
LDAP: Permet de parcourir et eventuellement de modifier.
Bon Courage à tous!!!
Partager