我正在使用python-ldap库连接到我们的LDAP服务器并运行查询。我遇到的问题是,尽管在搜索上设置了大小限制,但我仍会在任何返回太多结果的查询中收到SIZELIMIT_EXCEEDED错误。我知道查询本身是有效的,因为如果查询返回一小部分用户,我将得到一个结果。即使我将大小限制设置为荒谬的东西,比如1,我仍会在这些更大的查询上得到SIZELIMIT_EXCEEDED。我在下面粘贴了我的查询的通用版本。关于我在这里做错了什么想法?
result = self.ldap.search_ext_s(self.base, self.scope, '(personFirstMiddle=<value>*)', sizelimit=5)
答案 0 :(得分:0)
当LDAP客户端请求大小限制时,称为“客户端请求的”&#39;大小限制。客户端请求的大小限制不能覆盖服务器设置的大小限制。服务器可以为整个服务器,特定授权标识或其他原因设置服务器的大小限制 - 无论哪种情况,客户端都不能覆盖服务器大小限制。搜索请求可能必须使用simple paged results
控件或virtual list view
控件以多个部分发布。
答案 1 :(得分:0)
这是我对here和official 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
问题:)