2015-12-09 22 views
6

Jestem w stanie powiązać i zapytać Active Directory przez python-ldap bez żadnych problemów, z wyjątkiem sytuacji, gdy chodzi o dodawanie lub modyfikowanie atrybutów w AD. Mogę dodać atrybut, ale kodowanie wydaje się być wyłączone, ponieważ cały tekst jest zniekształcony.Python LDAP zapisuj wpis do Active Directory

Próbowałem kodowania mój ciąg z utf8 i kilka innych bez powodzenia.

Próbowałem również powiązania z kontem administratora domeny wraz z powiązaniem z kontem użytkownika, do którego będę zmieniał atrybut, ten sam wynik niezależnie.

Oto metoda używam zaktualizować atrybut:

klasy 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 

Doing ldapsearch przez terminal to co atrybut wygląda następująco:

mobile:: MC8sAQAAAAAQNA== 

ten tak wygląda "Hello World", gdy ustawiam komórkę:

mobile:: 77+9ehsCAAAAABDvv70V 

Sprawdziłem MSDN i mówi, że atrybut ldap jest tylko ciągiem znaków Unicode.

System: Ubuntu 15.10 64bit Python: 2.7.10 python-ldap == 2.4.21

Na marginesie mogę reklama w wyszukiwarce bez żadnych problemów i analizowania/wyświetlacz wrócił atrybutów użytkownika, kwestia tylko wydaje się, że przy tworzeniu lub modyfikowaniu atrybutów przychodzi ten problem z kodowaniem.

+0

czy możesz sprawdzić jakie zapytanie wysyła 'tcpflow -c port 389'? – kwarunek

+0

Oto zrzut z powyższego zapytania modyfikującego: tcpflow -c port 389 tcpflow: nasłuchiwanie na eth0 010.001.200.029.54760-010.000.000,039.00389: 0C'> '-CN = Administrator, CN = użytkownicy, DC = firma , 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 = firma, DC = com00 pmobile1 010,000,000,039.00389-010.001.200.029.54760: 0g – xXPhenom22Xx

Odpowiedz

0

Ok dowiedziałem się, co się dzieje, używałem pypy 4.0.1 jako tłumacza iz jakiegoś powodu to było albo powodując problemy z biblioteki python-ldap i/lub kodowanie ciągów.

Powróciłem do wersji Python 2.7.10 dla interpretera, a teraz te same komendy modyfikują powyższe czynności zgodnie z oczekiwaniami, używając biblioteki python-ldap. Więc na pewno należy zachować ostrożność, jeśli używasz PyPy i tej konkretnej biblioteki ...

0

Symbol "=" na końcu często sygnalizuje, że kodowanie jest kodowane Base64. Python ma standardową bibliotekę dla encoding/decoding base64 (link jest dla Pythona 3, ale Python 2 ma również bibliotekę). LDAP rzeczywiście używa Base64 do czegoś. Zobacz The LDAP Data Interchange Format (LDIF).

+0

Dzięki za odpowiedź. Wydaje się, że jest coś dziwnego w kodowaniu, na przykład jeśli zmienię atrybut mobilny i ustawię go na "Hello World", będzie on przechowywany w AD jako: mobile :: 77 + 9ehsCAAAAABDvv70V To nie dekoduje niczego w Base64 poza bełkotem. Jeśli używam OpenLDAP z wiersza poleceń, mogę utworzyć plik .ldif, aby zmodyfikować ten atrybut, i będzie on wyświetlany poprawnie, więc nie jestem pewien, czy jest to coś specjalnie powiązanego z python-LDAP i AD? – xXPhenom22Xx

+0

Widziałem również, że podwójny dwukropek w wyniku wyszukiwania LDAP oznacza element zakodowany w Base64, ale jeśli zmienię atrybut za pośrednictwem pliku LDIF, atrybut nie zostanie zakodowany, wydaje się, że zachowuje się tylko w ten sposób, gdy próbuję modyfikować atrybutów przez python, a nie przy użyciu poleceń openLDAP ... – xXPhenom22Xx

0

Spójrz na kod od pyad wyjaśnić, co należy zrobić: https://pypi.python.org/pypi/pyad

To Python oparte.

Innym przykładem na już odpowiedział na pytanie: Use Python script to manage remote LDAP server

+0

Podany link adLDAP to biblioteka PHP, a nie Python. Spojrzałem także na inne łącze, jak również, mogę wiązać i przeszukiwać moje AD bez żadnych problemów, chociaż kiedy modyfikuję attribs, to jest on zakodowany w dziwnym zestawie znaków, nawet używając tego samego kodu z przykładu, który podałeś – xXPhenom22Xx

+0

wow masz rację, wygląda na to, że dziś nie mam pojęcia o sobie! Przepraszam za to. Chciałem wskazać na https://pypi.python.org/pypi/pyad – Eduardo

Powiązane problemy