如何用ldap3优化LDAP_MATCHING_RULE_IN_CHAIN查询AD嵌套组成员性能
问题原因分析
首先可以明确:LDAP_MATCHING_RULE_IN_CHAIN(即OID 1.2.840.113556.1.4.1941)本身在嵌套层级不高的场景下,域控侧递归计算的开销极低,正常返回耗时仅为百毫秒级,2分钟的耗时和该匹配规则无关,问题出在你的查询配置上,核心影响点有两个:
- 你使用了
attributes = "*"通配符拉取所有对象属性,会把大量无用的大体积属性比如用户头像、数字证书、服务主体名等全部拉取回来,数据传输和解析的耗时被大幅放大。 - 你使用的
SAFE_RESTARTABLE客户端策略本身会做额外的连接校验、请求重试封装,开销远高于默认同步策略,在域控响应有轻微延迟的场景下会进一步放大耗时。
优化方案
你可以按优先级依次尝试以下优化措施,实测可将查询耗时压缩到秒级甚至百毫秒级:
- 替换通配符属性为实际需要的属性列表,只拉取业务必要的字段,比如只需要账号、名称、DN的话就写
attributes = ["sAMAccountName", "displayName", "distinguishedName"]。 - 更换连接策略,没有特殊的断连重连需求的话直接去掉
client_strategy=SAFE_RESTARTABLE配置,使用默认同步策略即可;如果确实需要重连能力,可换成开销更低的RESTARTABLE策略。 - 缩小搜索基数,如果你要查询的成员都归属在指定OU下,就把
search_base设置为对应OU的DN,不要直接从根域开始搜索,可大幅减少域控的扫描范围。 - 开启分页查询,哪怕预期返回的成员数量很少,添加
paged_size=1000参数也能避免单次请求拉取大量数据导致的阻塞超时。 - 如果上述优化后仍有性能问题,可放弃域控侧递归,改为自行迭代拉取组成员:先查目标组的
member属性,对每个返回的DN判断对象类型,如果是组就继续查询该组的member属性,直到所有成员都是用户/计算机对象即可,这种方式在低嵌套场景下性能更可控。
优化后的完整参考代码:
from ldap3 import Server, Connection, SCHEMA server = Server(myserver, get_info=SCHEMA) # 采用默认同步策略,开启自动绑定 conn = Connection(server,'username', 'password', auto_bind=True) status, result, response, _ = conn.search( search_base='ou=业务用户,dc=xx,dc=xx,dc=xx', # 缩小搜索基到成员所属OU search_filter='(memberOf:1.2.840.113556.1.4.1941:=cn=group_name,ou=xx-xxxx,ou=xx,dc=xx,dc=xx,dc=xx)', attributes = ["sAMAccountName", "displayName", "distinguishedName"], # 仅拉取必要属性 paged_size=1000 # 开启分页查询 ) print(response)
内容的提问来源于stack exchange,提问作者hello
相关产品推荐
相关产品推荐

