2017-06-28 1 views
0

Ich habe ein aktives Verzeichnis ausgeführt und möchte ein Attribut eines Benutzers ändern. Ich benutze die python3 ldap3 Bibliothek und die modify() Methode. Mein Code unten führt jedes Mal eine Ausnahme aus, wenn ich versuche, den Benutzer zu ändern.ldap3/python3 Verbindung modify() -Funktionsfehler (ungültige Änderung) mit Active Directory

from ldap3 import Server, Connection, MODIFY_REPLACE 

server = Server('ldaps://domain.local:636', port = 636, use_ssl = True) 
try: 
    conn = Connection(server, user="[email protected]", password="MYPW", auto_bind=True) 
    print("User found") 
except: 
    print("User not found or connection error") 


result = conn.modify('CN=phil stone,OU=Firewall,DC=domain,DC=local',{'rules': [(MODIFY_REPLACE, ['replaced-text'])]}) 

print(result) 

Traceback (most recent call last): 
    File "/mnt/hgfs/shared/eclipse/osfipa/ldap/ldap_write.py", line 28, in <module> 
    result = conn.modify('CN=phil stone,OU=Firewall,DC=domain,DC=local',{'rules': [(MODIFY_REPLACE, ['replaced-text'])]}) 
    File "/usr/local/lib/python3.5/dist-packages/ldap3/core/connection.py", line 763, in modify 
    raise LDAPChangesError(self.last_error) 
ldap3.core.exceptions.LDAPChangesError: malformed change 

Im AD GUI i das Attribut "distinguishedName" überprüft haben, der Benutzer (Object) und sein Wert ist „CN = philipp Stein, OU = Firewall, DC = Domain, DC = lokal ". Also der DN für die Änderungsfunktion sollte korrekt sein. Und ich möchte das Attribut "Regeln" ändern.

Irgendwelche Ideen was mache ich hier falsch? Thx im Voraus.

+0

Ich weiß nicht, Python ist, aber es scheint mir seltsam, dass Sie versuchen, Modifizieren Sie einen Eintrag mit einem Mod_replace, ohne entweder das zu ersetzende Attribut anzugeben oder den Wert, den Sie ersetzen möchten. – Esteban

+0

Alles, was Sie erwähnt haben, ist das Attribut 'Regeln'. Der Wert, den ich ersetzen möchte, ist die Zeichenkette "Ersetzter Text" –

+0

Sie wissen was, es gibt Bearbeitungsverlauf auf Stackoverflow. Und als ich den Kommentar gepostet habe, gab es keinen "ersetzten-Text". Außerdem, da nichts über Python, aber etwas über LDAP bekannt ist, sollte eine Modifikationsoperation mit einem leeren Wert, die vom Protokoll RFC angeboten wird, als modifiziertes Löschen interpretiert werden, daher der Stack-Trace imho: '[(MODIFY_DELETE, []])] '(was vor 30 Sekunden war). Also für einen Idioten, ich wünsche Ihnen Glück auf diese – Esteban

Antwort

0

https://github.com/cannatag/ldap3/issues/42

Es gibt einen einfachen Syntaxfehler. Im obigen Link kann man die Antwort finden. Die einfache Lösung war, es wie der Code unten zu ändern.

result = conn.modify('CN=phil stone,OU=Firewall,DC=domain,DC=local',{'rules': (MODIFY_REPLACE, ['replaced-text'])}) 

Blick auf den Teil „MODIFY_REPLACE ersetzt Text“, gibt es keine Liste ([]) um ihn herum;)