搜索哪些组是

问题描述 投票:0回答:1

我需要在 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()
python active-directory ldap python-ldap
1个回答
0
投票

问题是 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()
© www.soinside.com 2019 - 2024. All rights reserved.