Атрибут записи Python LDAP в Active Directory

Я могу привязываться и запрашивать Active Directory через python-ldap без каких-либо проблем, за исключением случаев, когда речь идет о добавлении или изменении атрибутов в 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 64-битная Python: 2.7.10 python-ldap==2.4.21

В качестве примечания я могу выполнять поиск в AD без каких-либо проблем и анализировать/отображать возвращаемые пользовательские атрибуты, проблема, по-видимому, связана только с созданием или изменением атрибутов, с которыми связана эта проблема с кодировкой.


person xXPhenom22Xx    schedule 09.12.2015    source источник
comment
не могли бы вы проверить, какой запрос отправлен tcpflow -c port 389?   -  person kwarunek    schedule 15.12.2015
comment
Вот дамп запроса на изменение выше: tcpflow -c порт 389 tcpflow: прослушивание eth0 010.001.200.029.54760-010.000.000.039.00389: 0C`›-CN=Администратор,CN=users,DC=company,DC= Com CoolPassword 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 = GOOGLEAPPS, DC = Company DC = COM.MABILE1. 00389-010.001.200.029.54760:0г   -  person xXPhenom22Xx    schedule 15.12.2015


Ответы (3)


'=' в конце часто указывает на то, что используется кодировка Base64. Python имеет стандартную библиотеку для кодирования/декодирования base64 (ссылка для Python 3 , но в Python 2 также есть библиотека). LDAP действительно для чего-то использует Base64. См. раздел Формат обмена данными LDAP (LDIF).

person Alex Taylor    schedule 10.12.2015
comment
Спасибо за ответ. Кажется, что-то странное с кодировкой, например, если я изменяю мобильный атрибут и устанавливаю для него значение «Hello World», он сохраняется в AD как: mobile:: 77+9ehsCAAAAABDvv70V Это не декодирует ничего в Base64, кроме тарабарщина. Если я использую OpenLDAP из командной строки, я могу создать файл .ldif для изменения этого атрибута, и он будет отображаться правильно, поэтому я не уверен, связано ли это с python-LDAP и AD? - person xXPhenom22Xx; 14.12.2015
comment
Я также видел, что двойное двоеточие в результатах поиска LDAP означает, что элемент закодирован в Base64, хотя, если я изменяю атрибут через файл LDIF, атрибут не кодируется, кажется, что он ведет себя таким образом, только когда я пытаюсь изменить атрибуты через python, а не с помощью команд openLDAP... - person xXPhenom22Xx; 14.12.2015


Хорошо, я узнал, что происходит, я использовал PyPy 4.0.1 в качестве интерпретатора, и по какой-то причине это вызывало проблемы с библиотекой python-ldap и/или кодировкой для строк.

Я вернулся к Python 2.7.10 для интерпретатора, и теперь те же команды модификации, что и выше, работают, как и ожидалось, с использованием библиотеки python-ldap. Так что, безусловно, предостережение при использовании PyPy и этой конкретной библиотеки....

person xXPhenom22Xx    schedule 15.12.2015