IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Vbscript Active Directory Lister\Compter les ordinateurs


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 42
    Par défaut Vbscript Active Directory Lister\Compter les ordinateurs
    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


    J'aimerai pouvoir écrire le même code avec le fournisseur LDAP si c'est possible. Pour cela je dois parcourir les OU. ou suis je obligé d'utiliser les accès ADO pour faire cela?

    Merci.

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

  2. #2
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 42
    Par défaut
    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)
    Voilà il me reste à faire ce code avec ADO (qui interroge en lecture seule)

    Si quelqu'un à une autre idée.

    P.S: attention Domain controller est compté comme une OU. il faut mettre une condition si on ne veut pas parcourir certaines OU.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 42
    Par défaut
    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
    si quelqu'un à la solution pour parcourir le CN=computers dans l'exemple 2 ca serait cool.=> J'ai trouvé voir le post au dessus

    Voilà je crois avoir repertorier les 3 façons de parcourir l'Active Directory.

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

    Bon Courage à tous!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBS] VBScript + Active Directory : Quelques manipulations
    Par valentin_55 dans le forum VBScript
    Réponses: 8
    Dernier message: 29/11/2012, 11h33
  2. Réponses: 1
    Dernier message: 26/04/2012, 21h39
  3. Réponses: 5
    Dernier message: 16/03/2012, 11h50
  4. Réponses: 0
    Dernier message: 20/04/2010, 14h14
  5. Active Directory connaitre tous les OU
    Par PrinceMaster77 dans le forum ASP
    Réponses: 0
    Dernier message: 07/04/2006, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo