我需要在 AD 中授权用户并接收用户成员所属的组列表。我已经完成了代码工作,但搜索需要很长时间 - 在我的小型办公室 AD(有 10 个用户和 10 个组)中大约需要 20 秒。这与网络超时无关,登录发生在几毫秒内。我发现正是 conn.search_s() 行太慢了。您对如何提高绩效有什么想法吗?我认为它应该在这么小的数据库中通过 LAN 搜索不到一秒......非常感谢!
import ldap
BIND_ADDRESS = "192.168.0.1"
USERNAME = "[email protected]"
PASSWORD = "myPassword"
LDAP_BASE = "dc=mydomain,dc=local"
conn = ldap.initialize("ldap://" + BIND_ADDRESS + ":389")
conn.simple_bind_s(USERNAME, PASSWORD)
result = conn.search_s(LDAP_BASE,
ldap.SCOPE_SUBTREE,
'userPrincipalName='+USERNAME,
['memberOf'])
print(result)
conn.unbind_s()
问题是 Active Directory 包含的结构比用户和组多得多,并且上面的代码正在到处搜索。
我通过将“cn=Users”添加到 LDAP 库来解决这个问题,这使得它仅在“用户 LDAP 空间”中搜索:
LDAP_BASE = "cn=Users, dc=mydomain,dc=local"
带有结果解析器的完整工作代码如下所示:
import ldap
BIND_ADDRESS = "192.168.0.1"
USERNAME = "[email protected]"
PASSWORD = "myPassword"
LDAP_BASE = "cn=Users, dc=mydomain,dc=local"
conn = ldap.initialize("ldap://" + BIND_ADDRESS + ":389")
conn.simple_bind_s(USERNAME, PASSWORD)
result = conn.search_s(LDAP_BASE,
ldap.SCOPE_SUBTREE,
'userPrincipalName='+USERNAME,
['memberOf'])
result = result[0][1]["memberOf"]
groups = []
for i in result:
group = i.decode("utf-8").split(",", 1)[0].replace("CN=", "")
groups.append(group)
print(groups)
conn.unbind_s()