Python-ldap搜索:超出大小限制

时间:2012-07-24 22:23:35

标签: python ldap python-ldap

我正在使用python-ldap库连接到我们的LDAP服务器并运行查询。我遇到的问题是,尽管在搜索上设置了大小限制,但我仍会在任何返回太多结果的查询中收到SIZELIMIT_EXCEEDED错误。我知道查询本身是有效的,因为如果查询返回一小部分用户,我将得到一个结果。即使我将大小限制设置为荒谬的东西,比如1,我仍会在这些更大的查询上得到SIZELIMIT_EXCEEDED。我在下面粘贴了我的查询的通用版本。关于我在这里做错了什么想法?

result = self.ldap.search_ext_s(self.base, self.scope, '(personFirstMiddle=<value>*)', sizelimit=5)

2 个答案:

答案 0 :(得分:0)

当LDAP客户端请求大小限制时,称为“客户端请求的”&#39;大小限制。客户端请求的大小限制不能覆盖服务器设置的大小限制。服务器可以为整个服务器,特定授权标识或其他原因设置服务器的大小限制 - 无论哪种情况,客户端都不能覆盖服务器大小限制。搜索请求可能必须使用simple paged results控件或virtual list view控件以多个部分发布。

答案 1 :(得分:0)

这是我对hereofficial documentation中发现的内容进行大量编辑后提出的Python3实现。在撰写本文时,它可与pip3软件包python-ldap版本3.2.0一起使用。

def get_list_of_ldap_users():
    hostname = "google.com"
    username = "username_here"
    password = "password_here"
    base = "dc=google,dc=com"

    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)
    connect=ldap_server
    search_flt = "(personFirstMiddle=<value>*)" # get all users with a specific middle name
    page_size = 500 # how many users to search for in each page, this depends on the server maximum setting (default is 1000)
    searchreq_attrlist=["cn", "sn", "name", "userPrincipalName"] # 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

这将返回所有用户的列表,但是您可以根据需要对其进行编辑以返回所需的内容,而不会出现SIZELIMIT_EXCEEDED问题:)