2015-12-09 2 views
6

Я могу привязывать и запрашивать Active Directory через python-ldap без каких-либо проблем, кроме случаев, когда речь идет о добавлении или изменении атрибутов в AD. Я могу добавить атрибут, но кодировка кажется удачной, поскольку весь текст искажен.Атрибут записи Python LDAP для Active Directory

Я пробовал кодировать мою строку с 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 питон-== 2.4.21 LDAP

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

+0

не могли бы вы проверить, какой запрос отправлен 'tcpflow -c порт 389'? – kwarunek

+0

Вот дамп из запроса на изменение выше: tcpflow -c порт 389 tcpflow: listen on eth0 010.001.200.029.54760-010.000.000.039.00389: 0C'> -CN = Administrator, CN = users, DC = компания , 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 = компания, DC = com00 pmobile1 010.000.000.039.00389-010.001.200.029.54760: 0g – xXPhenom22Xx

ответ

0

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

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

0

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

+0

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

+0

Я также видел, что результат двойного двоеточия в результатах поиска LDAP означает элемент в кодировке Base64, хотя, если я изменяю атрибут через LDIF-файл, атрибут не получает кодировку, он, похоже, ведет себя таким образом, когда я пытаюсь изменить атрибуты через python, а не используя команды openLDAP ... – xXPhenom22Xx

0

Взгляните на код из pyad уточнить, что делать: https://pypi.python.org/pypi/pyad

Это Python на основе.

Другой пример на уже ответил вопросом: Use Python script to manage remote LDAP server

+0

Указанная ссылка adLDAP представляет собой библиотеку PHP, а не Python. Я также посмотрел на другую ссылку, я могу без проблем связать и выполнить поиск по моему AD, хотя, когда я изменяю атрибуты, он кодируется в странном наборе символов, даже используя тот же код из примера, который вы предоставили – xXPhenom22Xx

+0

wow , ты прав, похоже, что я сегодня не в своем уме! Извини за это. Я хотел указать https://pypi.python.org/pypi/pyad – Eduardo

Смежные вопросы