2015-12-09 16 views
6

Sono in grado di associare e interrogare Active Directory tramite python-ldap senza problemi, tranne quando si tratta di aggiungere o modificare attributi su AD. Posso aggiungere l'attributo ma la codifica sembra essere molto lontana dal momento che tutto il testo è confuso.Attributo di scrittura LDAP Python ad Active Directory

Ho provato a codificare la mia stringa con utf8 e pochi altri senza fortuna.

Ho anche provato a eseguire il binding con un account di amministratore di dominio insieme all'associazione con l'account utente a cui cambierò un attributo, lo stesso risultato a prescindere.

Ecco il metodo che uso per aggiornare un attributo:

LdapHelpers classe:

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 

Facendo un ldapsearch tramite terminale questo è ciò che l'attributo appare come:

mobile:: MC8sAQAAAAAQNA== 

Questo è l'aspetto di 'Hello World' quando lo imposto:

mobile:: 77+9ehsCAAAAABDvv70V 

Ho controllato MSDN e dice che l'attributo ldap è solo una stringa Unicode.

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

Come nota a margine posso cercare dC senza problemi e analizzare/display restituito attributi utente, il problema solo sembra essere con la creazione o la modifica degli attributi che questo problema di codifica entra in gioco.

+0

potresti verificare quale query viene inviata 'tcpflow -c porta 389'? – kwarunek

+0

Ecco il dump della query di modifica sopra: tcpflow -c porta 389 tcpflow: ascolto su eth0 010.001.200.029.54760-010.000.000.039.00389: 0C'> -CN = Amministratore, CN = utenti, DC = società , 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 = società, DC = com00 pmobile1 010.000.000.039.00389-010.001.200.029.54760: 0g – xXPhenom22Xx

risposta

0

Ok ho scoperto cosa stava succedendo, stavo usando PyPy 4.0.1 come interprete e per qualche motivo questo era o causando problemi con la libreria python-ldap e/o codifica per stringhe.

Sono tornato a Python 2.7.10 per l'interprete e ora gli stessi comandi di modifica sopra funzionano come previsto usando la libreria python-ldap. Quindi sicuramente una parola di cautela se si utilizza PyPy e questa particolare libreria ....

0

Il '=' alla fine è spesso un indicatore che è la codifica Base64. Python ha una libreria standard per encoding/decoding base64 (Il collegamento è per Python 3, ma Python 2 ha anche la libreria). LDAP usa effettivamente Base64 per qualcosa. Vedi The LDAP Data Interchange Format (LDIF).

+0

Grazie per la risposta. Sembra esserci qualcosa di strano con la codifica, ad esempio se modifico l'attributo mobile e lo impostiamo su 'Hello World' è memorizzato in AD come: mobile :: 77 + 9ehsCAAAAABDvv70V Che non decodifica nulla in Base64 diverso dal linguaggio senza senso. Se sto usando OpenLDAP dalla riga di comando, posso creare un file .ldif per modificare quell'attributo e verrà visualizzato correttamente, quindi non sono sicuro se questo è qualcosa specificamente legato a Python-LDAP e AD? – xXPhenom22Xx

+0

Ho anche visto che i doppi due punti nel risultato di ricerca LDAP significano l'elemento in Base64 codificato, sebbene se modifico l'attributo tramite un file LDIF l'attributo non venga codificato, sembra che si comporti in questo modo solo quando sto cercando di modificare attributi via python piuttosto che usare i comandi openLDAP ... – xXPhenom22Xx

0

Date un'occhiata al codice pyad per chiarire che cosa fare: https://pypi.python.org/pypi/pyad

E 'basato su Python.

Un altro esempio in questione già risposto: Use Python script to manage remote LDAP server

+0

Il link adLDAP che hai fornito è una libreria PHP non Python. Ho anche guardato l'altro link già, posso legare e cercare contro il mio annuncio senza problemi, anche se quando modifico gli attributi viene codificato in un set di caratteri strani, anche usando lo stesso codice dell'esempio che hai fornito – xXPhenom22Xx

+0

wow , hai ragione, sembra che oggi sono fuori di testa! Mi dispiace per quello Intendevo puntare a https://pypi.python.org/pypi/pyad – Eduardo

Problemi correlati