1

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

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

4

2 回答 2

2

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

命令行使用的是绑定 dn,OFFICE\Administrator而脚本使用的是绑定 dncn=Administrator,dc=office,dc=lbox,dc=com

在 Active Directory 上,内置帐户Administrator不位于林的顶层AD,它通常至少位于 . 之下,因此您可能应该使用Users OU的 dn是:CN=Administrator,CN=Users,dc=office,dc=lbox,dc=com

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

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在 python 代码中使用从命令行查询返回的作为dn绑定。

于 2014-05-06T17:09:04.690 回答
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 )
于 2015-04-30T13:18:58.550 回答