Python LDAP 搜索

5 投票
2 回答
22554 浏览
提问于 2025-04-17 06:31

我一直在研究如何用Python搜索LDAP服务器,但卡了好几个小时,不知道为什么。这是我第一次尝试使用这种API。

这是我打开连接并尝试搜索的代码:

aims_server = '#####.com'
base_dn = 'cn=EMPLOYEES,cn=portal,cn=Groups,dc=Company,dc=com'
username = 'cn=admin,cn=users,dc=Company,dc=com'
password='#####'
directory=ldap.open(aims_server)
directory.simple_bind_s(username, password)

#retrieve the current members from group
old = {'uniquemember':attr['uniquemember']}

然后我故意把代码弄坏,这样我就可以用调试工具来搜索,使用的是:

>>> searchFilter = "cn=*"
>>> directory.search_s(base_dn,ldap.SCOPE_SUBTREE,searchFilter, retrieveAttributes)

结果:

[('cn=EMPLOYEES,cn=portal,cn=groups,dc=Company,dc=com', {'displayname': ['Employees'], 'description': ['Members of this group are employees. '], 'objectclass': ['top', 'groupOfUniqueNames', 'orclGroup'], 'orclisvisible': ['true'], 'owner': ['cn=portal_admin ,cn=users,dc=Company,dc=com', 'cn=portal,cn=users, dc=Company,dc=com'], 'uniquemember': ['cn=alan,cn=users,dc=Company,dc=com', 'cn=alan_r,cn=users,dc=Company,dc=com', ....

如果我使用过滤条件"cn=*",它会返回上面的字典,但如果我在searchFilter中放入任何内容,它就不会返回任何结果。

有没有人能给点建议?我在想是不是我搜索的目录层级不够深?

编辑

我能得到的最好结果是把设置改成:

searchFilter = "cn=*"
retrieveAttributes = ["uniquemember"]

然后:

(cn, attr) = searcher.pop()

返回:

{'uniquemember': ['cn=alan_t,cn=users,dc=company,dc=com','cn=alan_r,cn=users,dc=company....

看起来它在尝试搜索的层级太高了,我该如何再往下搜索一层,以找到唯一的成员呢?

我只想搜索他们的名字!

2 个回答

0

与其...

directory=ldap.open(aims_server)

我用过...

directory=ldap.initialize(aims_server)

另外,如果你有...

searchFilter = "cn=alan"
retrieveAttributes = ['cn']
results = directory.search_s( ... )
print results

那它还是不能满足你的需求吗?

10

我终于搞定了,花了我超过5个小时。

每次我调整配置的时候,我都会学到一点新东西,但基本上我得尝试各种组合才能让它正常工作。

结果发现,我可能对base_dn的设置太具体了,所以我把它改成了一个更高层次的。

base_dn = 'cn=users,dc=company,dc=com'

然后我意识到,我不能在uniquemember以下进行搜索,所以这个属性必须是我返回的。

retrieveAttributes = ["uniquemember"]

这样一来,过滤器就能正常工作了。

searchFilter = "cn=aaron*"

接下来,它会返回:

[('cn=Aaron_A@company.com,cn=Users,dc=company,dc=com', {})]

虽然最后会有一个空对象,但这仍然给了我想要的结果。

希望这能帮助到其他刚接触LDAP的人。

撰写回答