Python LDAP写入Active Directory的属性

xXP*_*2Xx 5 python python-2.7 python-ldap

我能够通过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
Run Code Online (Sandbox Code Playgroud)

通过终端执行ldapsearch这是属性的样子:

mobile:: MC8sAQAAAAAQNA==
Run Code Online (Sandbox Code Playgroud)

当我设置移动设备时,这就是'Hello World'的样子:

mobile:: 77+9ehsCAAAAABDvv70V
Run Code Online (Sandbox Code Playgroud)

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

系统:Ubuntu 15.10 64位Python:2.7.10 python-ldap == 2.4.21

作为旁注,我可以在没有任何问题的情况下搜索AD并解析/显示返回的用户属性,问题似乎只是创建或修改此编码问题的属性.

xXP*_*2Xx 0

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

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