我在从 LDAP 获取所有 FreeIPA 域用户属性时遇到问题。问题是
ldapsearch
和 ipa user-show
只提供非空属性,我需要找到一种方法来获取用户的所有属性。我正在使用 ldap3
库用 Python 编写一个脚本,下面是该脚本及其结果的示例。确保空属性对 ldap 浏览器有帮助,但我不明白它是如何获取它们的。基本 ldapsearch 命令对任何参数都没有帮助。
这是我的代码:
from ldap3 import Server, Connection, ALL, SUBTREE, ALL_ATTRIBUTES
ldap_server = 'ldap://$my_server$'
ldap_user = 'uid=admin,cn=users,cn=accounts,dc=$my_dc$,dc=local'
ldap_password = '$my_pass$'
base_dn = 'cn=users,cn=accounts,dc=$my_dc$,dc=local'
server = Server(ldap_server, get_info=ALL)
conn = Connection(server, user=ldap_user, password=ldap_password, auto_bind=True)
search_filter = '(uid=admin)'
conn.search(search_base=base_dn, search_filter=search_filter, search_scope=SUBTREE, attributes=['*'])
if conn.entries:
user = conn.entries[0]
print(f"User DN: {user.entry_dn}")
for attribute in user.entry_attributes:
print(f"{attribute}: {user[attribute]}")
else:
print("User not found")
conn.unbind()
最有趣的是,如果您通过指定
attributes=['$my_attr$']
显式访问空属性,此脚本将返回条目 $my_attr$: []
给定 LDAP 对象的属性由条目的
objectClass
给出。对于任何给定的对象,它们通常是许多类,例如 person
和 inetOrgPerson
。
这些对象类构成了目录架构,您可以在树的根部
rootDSE
进行查询。我不知道服务器返回空属性的方法。可能有一个控制,但这个算法应该适用于大多数目录:
在具有足够权限的经过身份验证的连接上:
(objectClass=*)
要考虑的事情:
(dn: cn=schema)
。我无法测试,但请使用您的 LDAP 浏览器尝试上述步骤以确定objectClass
,管理员可以定义自己的。您可以缓存架构的副本,但要保持新鲜