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

Python Discussion :

Python et LDAP "Size limit exceeded"


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut Python et LDAP "Size limit exceeded"
    Hello,
    Je remonte ce post qui corespond tout à fait à mon problème !

    Actuellement je développe un appli en python, et pour cela il faut que je récupère le mail de mes utilisateurs dans l'AD. J'utilise pour cela le module ldap de python, car le module activedirectory n'est pas assez complet.

    La fonction que j'ai écrit fonctionne bien mais quand il y à trop d'enregistrement j'ai le droit un une erreur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    result = func(*args,**kwargs)
    SIZELIMIT_EXCEEDED: {'desc': 'Size limit exceeded'}
    Après quelque recherche, j'ai peu comprendre qu'il était possible de changer cette valeur dans une variable global ou dans une la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ldapobject.SIZELIMIT_EXCEEDED = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print l.search_ext_s( base_dn, ldap.SCOPE_SUBTREE, filter, attrs,sizelimit=0)
    Voici la doc offciel:
    http://www.python-ldap.org/doc/html/ldap.html

    Mais j'ai toujours des erreur
    Si quelqu'un à des piste car si je me dépêche pas de trouver ça, ça va être tendu pour moi

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Pour faire des requêtes dans l'AD, je passe par ADSI, en utilisant ADO avec pywin32 (comme le fait le module active_directory de Tim Golden). Pour éviter le problème que tu as, je fais une requête asynchrone. Je ne sais pas si on peut contourner le problème de la même façon en LDAP.

    Je ne sais pas si préciser "sizelimit" suffit, mais je ne pense pas qu'il faut le mettre à 0. Si j'ai bien compris cela correspond au PageSize et il faut donc mettre une valeur entre 1 et le nombre maximum d'enregistrements retournés par le serveur. Essaie par exemple avec 500.

    Sinon peut-être en changeant le "MaxPageSize" sur le serveur (comme indiqué ici: http://support.microsoft.com/default...315071&sd=tech) mais il faut sans doute des droits de Domain Admin.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Hello dividee,
    Je t'avoue être un peut ralenti devant ce problème car après avoir essayé les requêtes asynchrone, ça ne me donne rien.
    Peut être les ai je mal exploité, je vais continuer à creuser de ce coté
    J'ai testé plusieurs "sizelimit" mais toujours l'erreur, et je ne peut absolument rien touché à l'AD

    ADSI, en utilisant ADO avec pywin32
    Tu te baserais donc sur l'API pywin32 comme le module activedirectory, pour effectuer des requêtes vers l'AD?...

    Je vais rester sur le module LDAP car quand il y à moins d'enregistrements cela fonctionne à merveille, et c'est plus portable

    Curieux qu'après l'augmentation du "pagesize" rien ne change, je voit pas trop ou chercher là...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je dois dire que le module python-ldap est très mal documenté, dès qu'on sort des sentiers battus, il faut se débrouiller seul...

    J'en ai bavé mais je suis finalement arrivé à quelque chose. Le code qui suit n'est qu'une ébauche; l'important c'est l'utilisation de SimplePagedResultsControl:
    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
    import ldap
    from ldap.controls import SimplePagedResultsControl
     
    PAGE_SIZE = 500
     
    l = ldap.initialize('ldap://my-server:3268')
    l.bind_s("user@domain.com","password")
     
    pg_ctrl = SimplePagedResultsControl(None, False, (PAGE_SIZE, ""))
     
    cnt = 0
    while True:
        msgid = l.search_ext('dc=domain,dc=com',ldap.SCOPE_SUBTREE,'(objectClass=*)',['distinguishedName'], serverctrls=[pg_ctrl])
        _, res_data, _, srv_ctrls = l.result3(msgid)
        for r in res_data:
            cnt +=1
        print cnt
        cookie = srv_ctrls[0].controlValue[1]
        if cookie:
            pg_ctrl.controlValue = (PAGE_SIZE, cookie)
        else:
            break
    Si tu retires l'argument serverctrls=[pg_ctrl] de search_ext, tu verras que tu obtiens aussi un SIZELIMIT_EXCEEDED.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Hello,
    dès qu'on sort des sentiers battus, il faut se débrouiller seul...
    Je suis tout à fait d'accord avec toi, j'ai passé de long moment pour ne pas trouver grand chose comme piste apart ce post ...

    En tout cas ton ébauche de code me permet de savoir le nombre d'entrée, mais pas le nom de mes objets.
    C'est une liste d'utilisateur que je doit récupérer.

    Effectivement quand on enlève serverctrls=[pg_ctrl] on à le droit au
    SIZELIMIT_EXCEEDED. Avec mon petit niveau en python il ne m'est pas facile de déboguer

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Citation Envoyé par BbT0n Voir le message
    En tout cas ton ébauche de code me permet de savoir le nombre d'entrée, mais pas le nom de mes objets.
    C'est une liste d'utilisateur que je doit récupérer.
    Ben oui j'ai juste fait un compteur en supposant que tu saurais quoi faire à partir de là...

    Le reste ça ne sort pas des sentiers battus , mais si tu ne connais pas du tout LDAP, trouve un tuto dessus, ce n'est pas la doc du module ldap de python qui va beaucoup t'aider.

    Un exemple sans doute un peu plus proche de ce que tu veux faire:
    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
    import ldap
    from ldap.controls import SimplePagedResultsControl
     
    PAGE_SIZE = 500
     
    l = ldap.initialize('ldap://my-server:3268')
    l.bind_s("user@domain.com","password")
     
    pg_ctrl = SimplePagedResultsControl(None, False, (PAGE_SIZE, ""))
     
    while True:
        msgid = l.search_ext('dc=domain,dc=com',ldap.SCOPE_SUBTREE,'(&(objectClass=User)(objectCategory=Person))',['sAMAccountName', 'mail'], serverctrls=[pg_ctrl])
        _, res_data, _, srv_ctrls = l.result3(msgid)
        for dn, attrs in res_data:
            if 'mail' in attrs:
                mail = attrs['mail'][0]
            else:
                mail = 'NO MAIL'
            print '%s (%s)' % (attrs['sAMAccountName'],mail)
        cookie = srv_ctrls[0].controlValue[1]
        if cookie:
            pg_ctrl.controlValue = (PAGE_SIZE, cookie)
        else:
            break
    Ce qu'il faut savoir (ça, c'est dans la doc!), c'est que res_data est une liste de tuples (dn, attrs) ou dn est un string et attrs un dictionnaire contenant les attributs demandés.

    A toi de te renseigner aussi sur Active Directory pour construire les filtres et déterminer les attributs qui t'intéressent...

    (Attention, l'attribut mail n'est peut-être pas ce qu'il te faut, en particulier si Exchange est utilisé).

Discussions similaires

  1. [12.5 ]Row size (2058 bytes) could exceed row size limit, which is 1962 bytes.
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 04/12/2007, 13h51
  2. Connection limit exceeded for non-superusers
    Par bitou dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 10/05/2007, 03h37
  3. Python et ldap
    Par Yotasky dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 11/10/2006, 17h56
  4. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31

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