【问题标题】:ldapsearch works but python-ldap doesn'tldapsearch 有效,但 python-ldap 无效
【发布时间】:2015-04-30 21:18:58
【问题描述】:

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

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

【问题讨论】:

  • 您收到错误消息了吗?你的 ldap 日志中有什么东西吗?
  • @DonQuestion 我已将完整错误添加到问题中。 Active Directory 日志中没有任何内容。我没想到要提到我正在连接到 Win2008 R2 上的 AD。
  • 您的身份验证似乎有问题。我猜它在绑定方法中犹豫不决?!看看packtpub.com/article/…
  • 是的,我希望有人能告诉我为什么python-ldap 绑定与ldapsearch 绑定有什么不同。
  • 您是否尝试过仅使用“cn=Administrator”或“Administrator”进行身份验证?

标签: python ldap python-ldap


【解决方案1】:

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

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

在 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

并使用从 Python 代码中的命令行查询返回的 dn 作为绑定的 dn

【讨论】:

    【解决方案2】:

    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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      相关资源
      最近更新 更多