Python LDAP查询Active Directory用户未返回全部属性的问题咨询
Python LDAP模块查询Active Directory仅返回部分属性的解决办法
这个问题我之前也碰到过,其实这不是Python ldap模块的限制,而是LDAP查询的默认行为——Active Directory在你没有明确指定要获取的属性时,只会返回一组默认的常用属性(比如cn、distinguishedName等),其他属性需要你显式声明才能获取到。
问题根源
你当前的search_s调用没有指定attrs参数,所以LDAP服务器只会返回预设的默认属性集合,这就是为什么你用Active Directory Explorer能看到完整属性,但代码里只拿到一部分的原因。
解决方案
修改search_s方法,添加attrs参数来指定你需要的属性:
- 如果想获取所有可读取的非构造属性,可以用
attrs=['*'] - 如果还需要获取构造属性(比如
lastLogonTimestamp、memberOf这类动态生成的属性),可以用attrs=['*', '+'] - 也可以指定具体属性列表,比如
attrs=['cn', 'mail', 'userPrincipalName', 'department']
修改后的代码示例
pp = pprint.PrettyPrinter(indent=2) search_filter = '(cn=foouser)' base_dn = 'DC=foo,DC=bar,DC=net' ldap_connection.protocol_version = ldap.VERSION3 ldap_connection.simple_bind_s(bind_dn, bind_password) try: # 这里添加attrs参数,获取所有属性(包括构造属性) result = ldap_connection.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter, attrs=['*', '+']) pp.pprint(result) except ldap.LDAPError, e: print e finally: ldap_connection.unbind_s()
额外注意事项
- 确保你用来绑定的AD账号拥有读取目标属性的权限,如果某些属性还是无法获取,大概率是权限不足,需要联系AD管理员调整权限。
- 避免在生产环境中盲目使用
['*', '+'],尽量只获取你实际需要的属性,这样能提升查询效率并减少数据传输量。
内容的提问来源于stack exchange,提问作者RCross
相关产品推荐
相关产品推荐

