如何通过单DC获取AD林中双域用户的sAMAccountname等指定属性?
解决方案
1. 启用LDAP自动引用(优先推荐)
你当前连接AD时设置了auto_referrals=False,这会阻止父域DC将跨域查询请求重定向到子域DC,直接导致查询corp.example.com返回空结果。修改连接参数启用自动引用即可解决:
conn = Connection(server="DC_of_the_example.com", user="example.com\\user", password="password", auto_bind=AUTO_BIND_NO_TLS, auto_referrals=True)
启用自动引用后,执行原有查询语句即可获取两个域的用户完整属性(包括department):
# 查询example.com域用户 parent_domain_users = conn.search( 'DC=example,DC=com', '(&(objectclass=user))', attributes=['sAMAccountname', 'distinguishedName', 'displayName', 'department'] ) # 查询corp.example.com域用户 child_domain_users = conn.search( 'DC=corp,DC=example,DC=com', '(&(objectclass=user))', attributes=['sAMAccountname', 'distinguishedName', 'displayName', 'department'] )
2. 合并结果并去重
由于每个用户的distinguishedName是AD中唯一的标识,可通过该属性实现无重复的用户集合:
# 合并两个域的用户列表 all_users = parent_domain_users + child_domain_users # 基于distinguishedName去重 unique_users = [] seen_dns = set() for user in all_users: user_dn = user.entry_attributes_as_dict['distinguishedName'][0] if user_dn not in seen_dns: seen_dns.add(user_dn) unique_users.append(user)
备选方案:手动切换子域DC查询
如果启用自动引用遇到网络或权限限制,可在同一个连接会话中手动切换到子域DC进行查询:
# 切换到corp.example.com的DC conn.server = "DC_of_corp.example.com" child_domain_users = conn.search( 'DC=corp,DC=example,DC=com', '(&(objectclass=user))', attributes=['sAMAccountname', 'distinguishedName', 'displayName', 'department'] ) # 切回example.com的DC查询父域用户 conn.server = "DC_of_the_example.com" parent_domain_users = conn.search( 'DC=example,DC=com', '(&(objectclass=user))', attributes=['sAMAccountname', 'distinguishedName', 'displayName', 'department'] )
内容的提问来源于stack exchange,提问作者Arius
相关产品推荐
相关产品推荐

