【问题标题】:Python LDAP write attribute to Active DirectoryPython LDAP 将属性写入 Active Directory
【发布时间】:2015-12-09 21:35:13
【问题描述】:

我能够通过 python-ldap 绑定和查询 Active Directory,除了在 AD 上添加或修改属性时,没有任何问题。我可以添加属性,但由于所有文本都是乱码,因此编码似乎有问题。

我尝试使用 utf8 和其他一些方法对我的字符串进行编码,但没有成功。

我还尝试与域管理员帐户绑定以及与我将更改属性的用户帐户绑定,但结果相同。

这是我用来更新属性的方法:

类 LdapHelpers:

def __init__(self):
    import ldap

    # set globals
    self.server = 'LDAP://dc.mycompany.com'
    self.admin_dn = 'CN=Administrator,CN=users,DC=mycompany,DC=com'
    self.admin_pass = 'coolpassword'

    # init LDAP connection
    #ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, 0)
    ldap.set_option(ldap.OPT_REFERRALS, 0)
    ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
    ldap.protocol_version = ldap.VERSION3
    self.ldap = ldap.initialize(self.server)

def update_attribute(self, attrib, value):
    try:
        import ldap
        conn = self.ldap
        conn.simple_bind_s(self.admin_dn, self.admin_pass)
        mod_attrs = [( ldap.MOD_REPLACE, "mobile", "6306564123")]

        # I have tried other variations of the above
        # mod_attrs = [( ldap.MOD_REPLACE, "mobile", "6306564123".encode('utf-8)]

        conn.modify_s('CN=Mike Smith,OU=GoogleApps,DC=company,DC=com', mod_attrs)
        print 'record updated'

    except ldap.LDAPError as e:
        return e.message

通过终端进行 ldapsearch 属性如下所示:

mobile:: MC8sAQAAAAAQNA==

当我将手机设置为“Hello World”时,这就是它的样子:

mobile:: 77+9ehsCAAAAABDvv70V

我查看了 MSDN,它说 ldap 属性只是一个 Unicode 字符串。

系统:Ubuntu 15.10 64bit 蟒蛇:2.7.10 python-ldap==2.4.21

作为旁注,我可以毫无问题地搜索 AD 并解析/显示返回的用户属性,问题似乎只在于创建或修改此编码问题所涉及的属性。

【问题讨论】:

  • 你能检查一下tcpflow -c port 389发送的查询吗?
  • 这里是上面修改查询的转储:tcpflow -c port 389 tcpflow: listener on eth0 010.001.200.029.54760-010.000.000.039.00389: 0C`>-CN=Administrator,CN=用户,DC=公司,DC=com 酷密码 010.000.000.039.00389-010.001.200.029.54760:0a 010.001.200.029.54760-010.000.000.039.00389:0[fV4CN=Jassen Michaels,OU=company,DC DC=com00 pmobile1 010.000.000.039.00389-010.001.200.029.54760: 0g

标签: python python-2.7 python-ldap


【解决方案1】:

末尾的“=”通常表示它是Base64 编码。 Python 有一个encoding/decoding base64 的标准库(该链接适用于 Python 3,但 Python 2 也有该库)。 LDAP 确实使用 Base64 做某事。见The LDAP Data Interchange Format (LDIF)

【讨论】:

  • 感谢您的回复。编码似乎有些奇怪,例如,如果我修改移动属性并将其设置为“Hello World”,则它在 AD 中存储为: mobile:: 77+9ehsCAAAAABDvv70V 这不会解码为 Base64 中的任何内容,除了胡言乱语。如果我从命令行使用 OpenLDAP,我可以创建一个 .ldif 文件来修改该属性,它会正确显示,所以我不确定这是否与 python-LDAP 和 AD 相关联?
  • 我还看到 LDAP 搜索结果中的双冒号表示以 Base64 编码的项目,但如果我通过 LDIF 文件修改属性,则属性不会被编码,它似乎只是表现这个当我尝试通过 python 而不是使用 openLDAP 命令修改属性时的方式...
【解决方案2】:

看一下 pyad 的代码以阐明要做什么:https://pypi.python.org/pypi/pyad

它是基于 Python 的。

已回答问题的另一个示例:Use Python script to manage remote LDAP server

【讨论】:

  • 您提供的 adLDAP 链接是 PHP 库而不是 Python。我也已经查看了其他链接,我可以毫无问题地绑定和搜索我的 AD,但是当我修改属性时,它会以奇怪的字符集编码,即使使用您提供的示例中的相同代码跨度>
  • 哇,你说得对,看来我今天疯了!对于那个很抱歉。我的意思是指向pypi.python.org/pypi/pyad
【解决方案3】:

好的,我发现了发生了什么,我使用 PyPy 4.0.1 作为解释器,由于某种原因,这要么导致 python-ldap 库和/或字符串编码出现问题。

我将解释器切换回 Python 2.7.10,现在上面的修改命令使用 python-ldap 库可以正常工作。所以如果使用 PyPy 和这个特定的库,绝对要小心......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2011-11-05
    相关资源
    最近更新 更多