1

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

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

2 回答 2

1

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

于 2012-07-25T10:04:39.400 回答
1

这是我在大量编辑我在此处官方文档中找到的内容后提出的 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问题:)

于 2020-05-15T21:03:10.530 回答