Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ADSI & compagnie je me lance

9 réponses
Avatar
Stephane
Bonjour à tous

Je me décide à regarder ce qui se passe un peu par là et ce qu'on peut
faire avec tout ca. Je suis allé zyeuté le site de Krosoft et j'y ai
trouvé un script qui permet de lister les users. Bien, ca fontionne je
comprends en gros comment ca marche mais y'a des détails qui me
paraissent obscurs:

Sub Sub_EnumUsers(sADsPath)
'ca ok
Dim objADobject
'ca ok aussi
Set objContainer = GetObject(sADsPath)
'ca ok aussi
objContainer.Filter = Array("User")
'La je vois ce que ca fait mais je comprends pas la syntaxe
For Each objADobject in objContainer
'Là ok
If objADobject.Class = "user" Then
'Quel intérêt de revérifier la Class ?

Merci pour vos éclaircissement.

@+ Stephane

9 réponses

Avatar
Gilles LAURENT
"Stephane" a écrit dans le message de
news:efg125$fbo$
| Bonjour à tous

Bonjour,

| objContainer.Filter = Array("User")
| 'La je vois ce que ca fait mais je comprends pas la syntaxe

La propriété 'Filter' contient un tableau (Array) dont les éléments
désignent le nom des classes des objets à inclure lors de l'énumération
de la collection par 'For Each'. Seuls les objets correpondant à ces
classes seront énumérés. Dans cet exemple, la fonction 'Array' permet de
créer un tableau à une seule dimension contenant la classe 'User'. Si on
souhaite inclure les classes 'User' et 'Group' lors de l'énumération
alors :
objContainer.Filter = Array ("User", "Group")

| If objADobject.Class = "user" Then
| 'Quel intérêt de revérifier la Class ?

En effet, cela peut sembler redondant par contre c'est nécessaire. Un
filtre a été appliqué pour n'inclure que les objets de la classe 'User'
(Filter = Array ("User")). Cependant, sachant que la classe 'Computer'
dérive de la classe 'User' alors les objets 'User' et 'Computer' seront
énumérés. Il est donc nécessaire de s'assurer que l'objet énuméré est
bien de la classe 'User' et non de la classe 'Computer'.

J'espère être suffisamment clair ;-)

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Stephane
| objContainer.Filter = Array("User")
La propriété 'Filter' contient un tableau (Array) dont les éléments
désignent le nom des classes des objets à inclure lors de l'énumération
de la collection par 'For Each'. Seuls les objets correpondant à ces
classes seront énumérés. Dans cet exemple, la fonction 'Array' permet de
créer un tableau à une seule dimension contenant la classe 'User'. Si on
souhaite inclure les classes 'User' et 'Group' lors de l'énumération
alors :
objContainer.Filter = Array ("User", "Group")


Si je reprends avec mes mots: On affecte à la propriété Filter un
tableau ne contenant que les users. Dans chaque case du tableau on
trouvera un référence aux objets users. Par contre cette fonction Array,
elle sort d'où ? et comment sait elle que je veux les users pour toute
l'AD et pas une seule OU ? Bref je comprends ce qu'elle fait mais
j'arrive pas à voir comment elle sait le faire.


| If objADobject.Class = "user" Then
| 'Quel intérêt de revérifier la Class ?

En effet, cela peut sembler redondant par contre c'est nécessaire. Un
filtre a été appliqué pour n'inclure que les objets de la classe 'User'
(Filter = Array ("User")). Cependant, sachant que la classe 'Computer'
dérive de la classe 'User' alors les objets 'User' et 'Computer' seront
énumérés. Il est donc nécessaire de s'assurer que l'objet énuméré est
bien de la classe 'User' et non de la classe 'Computer'.
Ok


J'espère être suffisamment clair ;-)
Oui et un grand merci à toi.


@+ Stephane

Avatar
Stephane
trouvera un référence aux objets users. Par contre cette fonction Array,
elle sort d'où ? et comment sait elle que je veux les users pour toute
l'AD et pas une seule OU ? Bref je comprends ce qu'elle fait mais
j'arrive pas à voir comment elle sait le faire.


Autant pour moi j'avais pas fait attention elle ne fait le tri que pour
l'OU en cours mais comment peut-elle savoir quelle Ou est en cours ?
Je comprends pas le binz !
Ou alors c'est directement dans l'objet objContainer que ca se passe ?
Filter contiendrait le critere de sélection et à partir de ce moment dès
qu'on interroge objContainer, il ne renvoit que des objets répondant au
critères de Filter ?


Le programme plus complet:

Set objRootDSE = GetObject("LDAP://RootDSE")
Set objDomain = GetObject("LDAP://" &
objRootDSE.Get("DefaultNamingContext"))

Call Sub_EnumOUs(objDomain.ADsPath)

Sub Sub_EnumOUs(sADsPath)
Set objContainer = GetObject(sADsPath)
objContainer.Filter = Array("OrganizationalUnit")
For Each objOrganizationalUnit in objContainer
WScript.Echo "Checking OU: " & objOrganizationalUnit.ADsPath
Wscript.Echo " User Object Count: " & intUserObjectCountAll
Sub_EnumUsers(objOrganizationalUnit.ADsPath)
Sub_EnumOUs(objOrganizationalUnit.ADsPath)
Next
End Sub

Sub Sub_EnumUsers(sADsPath)
Dim objADobject
Set objContainer = GetObject(sADsPath)
objContainer.Filter = Array("User")
For Each objADobject in objContainer

@+ Stephane

Avatar
Gilles LAURENT
"Stephane" a écrit dans le message de
news:efge1i$mtb$

| Autant pour moi j'avais pas fait attention elle ne fait le tri que
| pour l'OU en cours mais comment peut-elle savoir quelle Ou est en
| cours ?

Lors du bind :

' sADsPath contient le chemin de l'OU
' "bind" ou "connexion" à l'OU
Set objContainer = GetObject(sADsPath)

| Ou alors c'est directement dans l'objet objContainer que ca se passe ?
| Filter contiendrait le critere de sélection et à partir de ce moment
| dès qu'on interroge objContainer, il ne renvoit que des objets
| répondant au critères de Filter ?

Oui, c'est ça. Tout se passe dans la boucle For Each.
Un petit exemple commenté :

' sADsPath contient le chemin de l'OU
' "bind" ou "connexion" à l'OU
Set objContainer = GetObject(sADsPath)

' objContainer est une collection (un tableau d'objet)
' objContainer contient maintenant TOUS les objets de l'OU
' filtrage sur les objets de classe 'User'
objContainer.Filter = Array ("User")

' objContainer contient toujours TOUS les objets de l'OU
' énumération des objets
' grâce au filtre, seuls les objets 'User' seront énumérés
For Each objADobject in objContainer
' traitement des objets 'User' ou 'Computer'
' car la classe 'Computer' dérive de la classe 'User'
Next

| Le programme plus complet:

Avec ce code, tous les objets 'Users' de l'AD sont énumérés.
Le parcours de l'AD se fait par récursivité

' bind sur rootDse pour obtenir le dn complet de
' la racine du domaine (serverless binding)
' ex: LDAP://domaine.local
| Set objRootDSE = GetObject("LDAP://RootDSE")
| Set objDomain = GetObject("LDAP://" &
| objRootDSE.Get("DefaultNamingContext"))

' énumération des OU
| Call Sub_EnumOUs(objDomain.ADsPath)

' procédure pour l'énumération des OU
' en entrée le chemin de l'OU
| Sub Sub_EnumOUs(sADsPath)

' bind
| Set objContainer = GetObject(sADsPath)

' filtre sur la classe OU
| objContainer.Filter = Array("OrganizationalUnit")

' énumération des objets
' grâce au filtre, seuls les objets OU sont énumérés
| For Each objOrganizationalUnit in objContainer
| WScript.Echo "Checking OU: " & objOrganizationalUnit.ADsPath
| Wscript.Echo " User Object Count: " & intUserObjectCountAll

' énumération des utilisateurs membres de l'OU
| Sub_EnumUsers(objOrganizationalUnit.ADsPath)

' récursivité
' traitement de l'OU suivante
| Sub_EnumOUs(objOrganizationalUnit.ADsPath)

' poursuite de l'énumération des OU
| Next
| End Sub

' procédure pour lister les utilisateurs d'une OU
' en entrée le chemin de l'OU
| Sub Sub_EnumUsers(sADsPath)
| Dim objADobject

' bind
| Set objContainer = GetObject(sADsPath)

' filtre sur la classe 'User'
| objContainer.Filter = Array("User")

' énumération des objets
' grâce au filtre, seuls les objets 'User' sont énumérés
| For Each objADobject in objContainer

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Stephane
Avec ce code, tous les objets 'Users' de l'AD sont énumérés.
Le parcours de l'AD se fait par récursivité


A un détail près le programme nénumère pas les objets users qui sont à
la racine d'AD. Il faut rajouter une ligne de code.

Merci beaucoup à toi de m'avoir aider à comprendre ce programme.

@+ Stephane


' bind sur rootDse pour obtenir le dn complet de
' la racine du domaine (serverless binding)
' ex: LDAP://domaine.local
| Set objRootDSE = GetObject("LDAP://RootDSE")
| Set objDomain = GetObject("LDAP://" &
| objRootDSE.Get("DefaultNamingContext"))

' énumération des OU


Sub_EnumUsers(objDomain.ADsPath)
'Il faut rajouter cette ligne avant l'autre.

| Call Sub_EnumOUs(objDomain.ADsPath)


Avatar
Stephane

Avec ce code, tous les objets 'Users' de l'AD sont énumérés.
Le parcours de l'AD se fait par récursivité



A un détail près le programme nénumère pas les objets users qui sont à
la racine d'AD. Il faut rajouter une ligne de code.

Merci beaucoup à toi de m'avoir aider à comprendre ce programme.


Toutefois il reste une inconnue, est-ce normal que le programme ne me
retourne pas les comptes désactivés, car ca ca me gène un peu.

@+ Stephane


Avatar
Stephane

Avec ce code, tous les objets 'Users' de l'AD sont énumérés.
Le parcours de l'AD se fait par récursivité



A un détail près le programme nénumère pas les objets users qui sont à
la racine d'AD. Il faut rajouter une ligne de code.

Merci beaucoup à toi de m'avoir aider à comprendre ce programme.

@+ Stephane


' bind sur rootDse pour obtenir le dn complet de
' la racine du domaine (serverless binding)
' ex: LDAP://domaine.local
| Set objRootDSE = GetObject("LDAP://RootDSE")
| Set objDomain = GetObject("LDAP://" &
| objRootDSE.Get("DefaultNamingContext"))

' énumération des OU



Sub_EnumUsers(objDomain.ADsPath)
'Il faut rajouter cette ligne avant l'autre.

| Call Sub_EnumOUs(objDomain.ADsPath)


Avatar
Gilles LAURENT
"Stephane" a écrit dans le message de
news:efgjlk$q1a$

| Toutefois il reste une inconnue, est-ce normal que le programme ne me
| retourne pas les comptes désactivés, car ca ca me gène un peu.

Non, le filtre ne fait pas de distinction entre un compte activé et un
compte désactivé. Quel est le contenu de la procédure
Sub_EnumUsers(sADsPath) ? C'est là dedans que ça doit se passer ;-)

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Stephane
"Stephane" a écrit dans le message de
news:efgjlk$q1a$

| Toutefois il reste une inconnue, est-ce normal que le programme ne me
| retourne pas les comptes désactivés, car ca ca me gène un peu.

Non, le filtre ne fait pas de distinction entre un compte activé et un
compte désactivé. Quel est le contenu de la procédure
Sub_EnumUsers(sADsPath) ? C'est là dedans que ça doit se passer ;-)

Merde j'avais annulé le message, mais trop tard. C'est une connerie de

ma part.

@+ Stephane - merci pour tout