ldapsearch有效,但python-ldap没有

时间:2012-11-12 22:00:13

标签: python ldap python-ldap

以下工作并返回所有用户的列表

ldapsearch -x -b "ou=lunchbox,dc=office,dc=lbox,dc=com" -D "OFFICE\Administrator" -h ad.office.lbox.com -p 389 -W "(&(objectcategory=person)(objectclass=user))"

我正在尝试用Python做同样的事情,我得到Invalid credentials

#!/usr/bin/env python

import ldap

dn = "cn=Administrator,dc=office,dc=lbox,dc=com"
pw = "**password**"

con = ldap.initialize('ldap://ad.office.lbox.com')
con.simple_bind_s( dn, pw )

base_dn = 'ou=lunchbox,dc=office,dc=lbox,dc=com'
filter = '(objectclass=person)'
attrs = ['sn']

con.search_s( base_dn, ldap.SCOPE_SUBTREE, filter, attrs )

任何使这项工作的建议都会很棒。我正在努力学习python-ldap谢谢

修改

这是我得到的完整错误:

`ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1', 'desc': 'Invalid credentials'}`

LDAP服务器是Windows Server 2008 R2上的Active Directory

2 个答案:

答案 0 :(得分:2)

您正在使用命令行和python脚本的绑定的不同凭据。

当脚本使用OFFICE\Administrator

的绑定dn时,命令行正在使用cn=Administrator,dc=office,dc=lbox,dc=com的绑定dn

在Active Directory上,内置帐户Administrator不位于AD林的顶层,它通常至少位于Users {{1因此,可能应该使用的dn是:OU

为用户找到正确条目的最简单方法是在命令行搜索中实际使用帐户名称,例如

CN=Administrator,CN=Users,dc=office,dc=lbox,dc=com

并使用python代码中命令行查询返回的ldapsearch -x -b "ou=lunchbox,dc=office,dc=lbox,dc=com" -D "OFFICE\Administrator" -h ad.office.lbox.com -p 389 -W '(samaccountname=Administrator)' dn 作为绑定的dn

答案 1 :(得分:0)

python-ldap库不解析用户名,ldapsearch也不解析。在您的代码中,只需使用相同的用户名OFFICE\Administrator并让Active Directory处理它。

同样,ActiveDirectory拒绝对ldap进行简单绑定也并不罕见。您必须使用LDAPS。添加此行以绕过证书检查:

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)

所以整个代码可能如下所示:

#!/usr/bin/env python

import ldap

dn = "OFFICE\Administrator"
pw = "**password**"

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)

con = ldap.initialize('ldaps://ad.office.lbox.com')
con.simple_bind_s( dn, pw )

base_dn = 'ou=lunchbox,dc=office,dc=lbox,dc=com'
filter = '(objectclass=person)'
attrs = ['sn']

con.search_s( base_dn, ldap.SCOPE_SUBTREE, filter, attrs )