以下工作并返回所有用户的列表
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
答案 0 :(得分:2)
您正在使用命令行和python脚本的绑定的不同凭据。
当脚本使用OFFICE\Administrator
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 )