使用ldap3模块获取超1000条LDAP数据遇SizeLimitExceededResult问题求助
解决LDAP分页查询触发sizeLimitExceeded的问题
我之前也碰到过Active Directory里这种分页查询失效的情况,你的问题核心是没有正确配置分页参数,导致ldap3的自动分页机制没有正常工作,服务器直接返回了大小限制错误。
先看你遇到的错误:
ldap3.core.exceptions.LDAPSizeLimitExceededResult: LDAPSizeLimitExceededResult - 4 - sizeLimitExceeded - None - None - searchResDone - None
这个错误说明服务器拒绝返回超过1000条的结果,而你的分页查询没有正确触发——问题出在paged_size=None这个参数上。当设置为None时,ldap3会尝试使用服务器的默认分页大小,但很多AD服务器会强制要求客户端明确指定分页大小,而且必须等于或小于服务器的单页限制(通常是1000)。
修改后的完整代码
# import class and constants from ldap3 import Server, Connection, ALL, SUBTREE # define the server s = Server(host='xyz', port=xxxx, use_ssl=True, get_info='ALL') c = Connection(s, auto_bind='NONE', version=3, authentication='ANONYMOUS', client_strategy='SYNC', auto_referrals=True, check_names=True, read_only=False, lazy=False, raise_exceptions=False) c.bind() # 关键修改:设置paged_size为服务器允许的单页最大值(AD默认1000) results = c.extend.standard.paged_search( search_base = 'Ou=XYZ,dc=org,dc=com', search_filter = '(AppID=*)', search_scope = SUBTREE, get_operational_attributes=True, attributes=['*'], generator=True, paged_size=1000 # 这里从None改成1000 ) i=0 for entry in results: # 过滤掉searchResDone这类非条目响应 if entry['type'] == 'searchResEntry': print(entry) i+=1 print(f"总共获取到 {i} 条记录")
关键调整说明
- 设置
paged_size=1000:这是AD服务器默认的单页返回上限,明确指定这个值后,ldap3会自动处理分页逻辑——每获取1000条就自动发送下一页的请求,直到所有结果都被获取。 - 过滤非条目响应:分页查询过程中会返回
searchResDone这类控制消息,加上类型判断可以避免打印无关内容,同时保证计数准确。
额外注意事项
- 如果你的AD服务器的单页限制不是1000,可以尝试调整
paged_size为更小的值(比如500),确保在服务器的限制范围内。 - 保持
generator=True:这个参数让结果以生成器形式返回,避免一次性加载所有5000+条记录到内存,提升性能。
这样修改后,应该就能完整获取所有5000+条记录了,不会再触发大小限制错误。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

