OVH Cloud OVH Cloud

pb limitation MaxValRange

6 réponses
Avatar
fabricel
bonjour,

je souhaite remonter par script (le temps du script ou à défaut
définitvement) la valeu MaxValRange de LDAP. ppur le moment je ne sais le
faire qu'avec ntdsutil en mode console.

si quelqu'un peut m'aider SVP

voir ci-dessous pour les motivations.
j'ai des scripts en vbs qui gèrent les utilisateurs en récupérant la liste
des membres d'un groupe. par défaut 2003 serveur ne retourne que 1500 valeurs
ainsi si on souhaite traitéer les membres d'un groupe contenant plus de 1500
membres (1000 sous 20000 serveurs) seuls les 1500 premiers sont traités.

exemple :
'debut du script
On Error Resume Next

Set objGroup = GetObject _
("LDAP://cn=groupetest,cn=Users,dc=test,dc=local")
objGroup.GetInfo
nb=0

arrMemberOf = objGroup.GetEx("member")

WScript.Echo "Members:"
For Each strMember in arrMemberOf
nb=nb+1
WScript.echo nb&" "&strMember
Next
' fin du script

ce script fonctionne ne renvoi que les 1500 premiers membres du groupe
"groupetest"

6 réponses

Avatar
Gilles LAURENT
"fabricel" a écrit dans le message
de news:
| bonjour,

Bonjour,

[...]
| j'ai des scripts en vbs qui gèrent les utilisateurs en récupérant la
| liste des membres d'un groupe. par défaut 2003 serveur ne retourne
| que 1500 valeurs ainsi si on souhaite traitéer les membres d'un
| groupe contenant plus de 1500 membres (1000 sous 20000 serveurs)
| seuls les 1500 premiers sont traités.

Pour être en mesure de lire toutes les valeurs d'un attribut multivalué
vous pouvez utiliser une requête ldap via ado en spécifiant une limite
de plage. Cette technique permet de lire les valeurs par tranche, par
exemple, les 1000 premières valeurs de l'attribut puis les 1000
suivantes et ainsi de suite. Je vous invite à consulter cet article du
technet qui vous donnera la marche à suivre :
http://www.microsoft.com/technet/scriptcenter/guide/sas_ads_emwf.mspx

--
Gilles LAURENT
http://glsft.free.fr
Avatar
fabricel
merci je regarde..
"Gilles LAURENT" a écrit dans le message de news:
Oy3ltEA$
"fabricel" a écrit dans le message
de news:
| bonjour,

Bonjour,

[...]
| j'ai des scripts en vbs qui gèrent les utilisateurs en récupérant la
| liste des membres d'un groupe. par défaut 2003 serveur ne retourne
| que 1500 valeurs ainsi si on souhaite traitéer les membres d'un
| groupe contenant plus de 1500 membres (1000 sous 20000 serveurs)
| seuls les 1500 premiers sont traités.

Pour être en mesure de lire toutes les valeurs d'un attribut multivalué
vous pouvez utiliser une requête ldap via ado en spécifiant une limite
de plage. Cette technique permet de lire les valeurs par tranche, par
exemple, les 1000 premières valeurs de l'attribut puis les 1000
suivantes et ainsi de suite. Je vous invite à consulter cet article du
technet qui vous donnera la marche à suivre :
http://www.microsoft.com/technet/scriptcenter/guide/sas_ads_emwf.mspx

--
Gilles LAURENT
http://glsft.free.fr




Avatar
fabricel
bonjour,
je suis ne train de me battre avec la commande Range. elle refuse une plage
supérieur au nombre d'objet.
ainsi sur un groupe de 170 objet :


le vbs avec : Range=0- 169 fonctionne !
le vbs avec : RangeP-100 fonctionne !
le vbs avec : Range=0-200 ne fonctionne pas (il y a moins de 200
utilisateurs)

je ne trouve pas la syntaxe pour effectuer une requête de 0 à "la fin des
membres" (exemple de 1500 à ???)


"Gilles LAURENT" a écrit dans le message de news:
Oy3ltEA$
"fabricel" a écrit dans le message
de news:
| bonjour,

Bonjour,

[...]
| j'ai des scripts en vbs qui gèrent les utilisateurs en récupérant la
| liste des membres d'un groupe. par défaut 2003 serveur ne retourne
| que 1500 valeurs ainsi si on souhaite traitéer les membres d'un
| groupe contenant plus de 1500 membres (1000 sous 20000 serveurs)
| seuls les 1500 premiers sont traités.

Pour être en mesure de lire toutes les valeurs d'un attribut multivalué
vous pouvez utiliser une requête ldap via ado en spécifiant une limite
de plage. Cette technique permet de lire les valeurs par tranche, par
exemple, les 1000 premières valeurs de l'attribut puis les 1000
suivantes et ainsi de suite. Je vous invite à consulter cet article du
technet qui vous donnera la marche à suivre :

--
Gilles LAURENT
http://glsft.free.fr




Avatar
Gilles LAURENT
"fabricel" a écrit dans le message de
news:%23Ma87EM$
| bonjour,

Bonjour,

[...]
| je ne trouve pas la syntaxe pour effectuer une requête de 0 à "la fin
| des membres" (exemple de 1500 à ???)

Voici la technique à mettre en oeuvre :

' lecture de l'attribut multivalué
' tant que la requête renvoie des valeurs pour la plage
Do
@valeurs = requête Range=min-max
min = max + 1
max += 100
Tant que @valeurs

' la dernière requête n'a pas renvoyé de valeurs
' soit il n'y a plus de valeurs ou alors la plage était trop élevée
' nouvelle requête non bornée
@valeurs = requête Range=min-*

Tenez nous au courant.

--
Gilles LAURENT
http://glsft.free.fr
Avatar
fabricel
merci pour la réponse rapide.
je vais tester par curiosité mais je trouve le procédé un peut lourd

quel serait le danger d'augmenter la valeur MaxVaRange du ldap ?

"Gilles LAURENT" a écrit dans le message de news:
u85Yi0M$
"fabricel" a écrit dans le message de
news:%23Ma87EM$
| bonjour,

Bonjour,

[...]
| je ne trouve pas la syntaxe pour effectuer une requête de 0 à "la fin
| des membres" (exemple de 1500 à ???)

Voici la technique à mettre en oeuvre :

' lecture de l'attribut multivalué
' tant que la requête renvoie des valeurs pour la plage
Do
@valeurs = requête Range=min-max
min = max + 1
max += 100
Tant que @valeurs

' la dernière requête n'a pas renvoyé de valeurs
' soit il n'y a plus de valeurs ou alors la plage était trop élevée
' nouvelle requête non bornée
@valeurs = requête Range=min-*

Tenez nous au courant.

--
Gilles LAURENT
http://glsft.free.fr




Avatar
Gilles LAURENT
"fabricel" a écrit dans le message de
news:u4R2oIN$
| je vais tester par curiosité mais je trouve le procédé un peut lourd

Je vous ai concocté une petite fonction de lecture des membres d'un
groupe qui utilise les limites de plage. L'utilisation de cette fonction
permet de masquer la "lourdeur" du procédé :

--- Coupez ici : GetMembers.vbs ---

Function GetMembers (strGroupDN)

' déclaration des variables
Dim oCon, oCom, oRs
Dim nLastItem, nMin: nMin = 0
Dim arrRange, arrMembers (): ReDim arrMembers (0)
Dim bLastQuery
Dim strMember

' définition des constantes
Const MaxRecords = 5 ' [1..MaxValRange]

' initialisation des objets
Set oCon = CreateObject ("ADODB.Connection")
Set oCom = CreateObject ("ADODB.Command")

' connexion à l'annuaire
oCon.Open "Provider­sDSOObject"
oCom.ActiveConnection = oCon

Do ' boucle de lecture des membres du groupe
oCom.CommandText = _
"<LDAP://" & strGroupDN & ">;;member;" & _
"Range=" & nMin & "-" & nMin + MaxRecords & ";base"
Set oRs = oCom.Execute
arrRange = oRs.Fields ("member;Range=" & nMin & "-" &
nMin+MaxRecords)
If Not IsArray (arrRange) Then
bLastQuery = True
oCom.CommandText = _
"<LDAP://" & strGroupDN & ">;;member;" & _
"Range=" & nMin & "-*;base"
Set oRs = oCom.Execute
arrRange = oRs.Fields ("member;Range=" & nMin & "-*")
End If
If Not IsArray (arrRange) Then
GetMembers = Array ()
Exit Function
End If
nLastItem = UBound (arrMembers)
Redim Preserve arrMembers (nLastItem + UBound (arrRange) + 1)
For Each strMember In arrRange
arrMembers (nLastItem) = strMember
nLastItem = nLastItem + 1
Next
nMin = nMin + MaxRecords + 1
Loop Until bLastQuery
ReDim Preserve arrMembers (UBound (arrMembers) - 1)
GetMembers = arrMembers

End Function

--- Coupez ici : GetMembers.vbs ---

Donc pour lire tous les membres du groupe 'groupetest' :

arrMemberOf = GetMembers ("cn=groupetest,cn=users,dc=test,dc=local")
For Each strMember In arrMemberOf
WScript.Echo strMember
Next

| quel serait le danger d'augmenter la valeur MaxValRange du ldap ?

Je ne sais pas trop mais probablement des baisses de performances du
serveur lors du traitement de gros volumes ... Quoi qu'il en soit, même
si vous augmentez cette valeur, il y aura par définition toujours une
limite dans le nombre d'enregistrements retournés ;-) Je pense donc que
l'utilisation de la technique des limites de plage est préférable.

--
Gilles LAURENT
http://glsft.free.fr