5

我可以通过 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 Python:2.7.10 python-ldap==2.4.21

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

4

3 回答 3

0

末尾的“=”通常表明它是Base64编码。Python 有一个用于编码/解码 base64的标准库(该链接适用于 Python 3,但 Python 2 也有该库)。LDAP 确实使用 Base64 做某事。请参阅LDAP 数据交换格式 (LDIF)

于 2015-12-10T02:55:47.903 回答
0

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

它是基于 Python 的。

已回答问题的另一个示例:使用 Python 脚本管理远程 LDAP 服务器

于 2015-12-14T20:42:38.643 回答
0

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

我为解释器切换回 Python 2.7.10,现在上面的修改命令使用 python-ldap 库按预期工作。因此,如果使用 PyPy 和这个特定的库,绝对要小心……

于 2015-12-15T16:24:58.503 回答