12
votes

LDAP: LDAP.SIZELIMIMIT_EXEDEDED

Je reçois une erreur ldap.sizelimit_exeded erreur lorsque j'exécute ce code: xxx

nom d'utilisateur est mon nom d'utilisateur réel, < Code> Mot de passe Est mon mot de passe réel et Domaine est le domaine actuel.

Je ne comprends pas pourquoi c'est. Quelqu'un peut-il verser une lumière?


0 commentaires

6 Réponses :


6
votes

manuel: http://www.python-lap.org/doc/ HTML / LDAP.HTML

exception ldap . Sizelimit_exededed

Une limite de taille du LDAP a été dépassée. Ce pourrait être dû à un sizelimit Configuration sur le serveur LDAP.

Je pense que votre meilleur pari ici est de limiter le Sizelimit sur le message que vous recevez du serveur. Vous pouvez le faire en définissant l'attribut ldapobject.sizelimit (obsolète) ou à l'aide du paramètre Sizelimit lors de l'utilisation de Search_ext ()

Vous devez également vous assurer que votre BIND ait réussi ...


2 commentaires

Merci pour cela. Je suppose que cela aurait dû être ma première source.


Il convient de noter que lorsque vous pouvez utiliser Search_ext (Taille = souhaité_num) Pour éviter le LDAP.SIZELIMIT_EXECKEDED Exception, cela ne vous permettra pas de voir tous les utilisateurs. Le sizelimit n'écrase pas les paramètres du serveur, de sorte que si le serveur ait le Sizelimit défini sur 100 utilisateurs, vous ne pouvez pas simplement définir la taille à 500 et vous attendre à les récupérer.



0
votes

Active Directory par défaut pour renvoyer un max de 1000 résultats. Ce qui est en quelque sorte ennuyeux, c'est plutôt que de retourner 1000, avec un code d'erreur associé, il semble envoyer le code d'erreur sans les données.

eDirectory commence sans défaut et est complètement conifgurable de tout ce que vous voulez.

Les autres répertoires le gérer différemment. (Modifier et ajouter, si vous savez).


2 commentaires

Je pensais que cela se produisait. Donc, ce que je fais maintenant, c'est de retour Regarder la première lettre du nom de famille. C'est une meilleure idée que de montrer des milliers d'employés à la fois.


Sachez que la recherche de la première lettre d'un nom ne fonctionne pas. Puisque finalement, votre ensemble de données sera suffisamment grand pour retourner plus de 1000 s et ainsi de suite ...



2
votes

0 commentaires

2
votes

Le filtre que vous avez fourni ( ObjectClass = * ) est un filtre de présence . Dans ce cas, il limite les résultats à la demande de recherche à des objets dans le répertoire et sous l'objet de base que vous avez fourni - quel est chaque objet sous l'objet de base car chaque objet comporte au moins un ObjectClass . Limitez votre recherche à l'aide d'un filtre plus restrictif ou d'une portée plus stricte, ou d'un objet de base inférieur, ou des trois. Pour plus d'informations sur le sujet de la demande de recherche, voir Utilisation de LDAPSECH < / a> et LDAP: Programmation Pratiques .

Les administrateurs de serveur de répertoires sont libres d'imposer une limite de serveur à l'échelle des entrées pouvant être renvoyées sur des clients LDAP, ceux-ci sont appelés limite de taille imposée au serveur. Il y a une limite de temps qui suit les mêmes règles.

Les clients LDAP doivent toujours alimenter une limite de taille et une limite de temps avec une demande de recherche, ces limites, appelées les limites demandées par le client ne peuvent toutefois pas remplacer les limites imposées au serveur.


0 commentaires

0
votes

Vous devez utiliser la recherche en pagie pour y parvenir. La taille de la page dépendrait de votre serveur LDAP, 1000 fonctionnerait pour Active Directory.

Jetez un coup d'œil à http: //google-apps-for-your-domain-ldap-sync.googlecode.com/svn/trunk/ldap_ctxt.py Pour un exemple


0 commentaires

4
votes

Vous rencontrez cette exception très probablement parce que le serveur que vous communiquez avec plus de résultats que ne peut être retourné par une seule demande. Afin de contourner ce problème, vous devez utiliser des résultats en pages pouvant être effectués en utilisant SIMPLEPAGEDRESULTSULTROL .

Voici une implémentation Python3 que j'ai proposée après une édition fortement ce que j'ai trouvé ici et dans Documentation officielle . Au moment de la rédaction de cela, il fonctionne avec le package PIP3 Python-LDAP version 3.2.0 . P>

def get_list_of_ldap_users():
    hostname = "<domain>:389"
    username = "username_here"
    password = "password_here"
    base = "ou=People,dc=tnc,dc=org"

    print(f"Connecting to the LDAP server at '{hostname}'...")
    connect = ldap.initialize(f"ldap://{hostname}")
    connect.set_option(ldap.OPT_REFERRALS, 0)
    connect.simple_bind_s(username, password)
    search_flt = "(objectClass=*)"
    page_size = 500 # how many users to search for in each page, this depends on the server maximum setting (default highest value is 1000)
    searchreq_attrlist=["sn"] # change these to the attributes you care about
    req_ctrl = SimplePagedResultsControl(criticality=True, size=page_size, cookie='')
    msgid = connect.search_ext(base=base, scope=ldap.SCOPE_SUBTREE, filterstr=search_flt, attrlist=searchreq_attrlist, serverctrls=[req_ctrl])

    total_results = []
    pages = 0
    while True: # loop over all of the pages using the same cookie, otherwise the search will fail
        pages += 1
        rtype, rdata, rmsgid, serverctrls = connect.result3(msgid)
        for user in rdata:
            total_results.append(user)

        pctrls = [c for c in serverctrls if c.controlType == SimplePagedResultsControl.controlType]
        if pctrls:
            if pctrls[0].cookie: # Copy cookie from response control to request control
                req_ctrl.cookie = pctrls[0].cookie
                msgid = connect.search_ext(base=base, scope=ldap.SCOPE_SUBTREE, filterstr=search_flt, attrlist=searchreq_attrlist, serverctrls=[req_ctrl])
            else:
                break
        else:
            break
    return total_results


0 commentaires