Python LDAP 搜索
我一直在研究如何用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的人。