Wie authentifiziere ich mich mit Python + LDAP gegen AD? Ich benutze derzeit die Python-LDAP-Bibliothek und alles, was sie produziert, sind Tränen.
Ich kann nicht einmal binden, um eine einfache Abfrage durchzuführen:
import sys
import ldap
Server = "ldap://my-ldap-server"
DN, Secret, un = sys.argv[1:4]
Base = "dc=mydomain,dc=co,dc=uk"
Scope = ldap.SCOPE_SUBTREE
Filter = "(&(objectClass=user)(sAMAccountName="+un+"))"
Attrs = ["displayName"]
l = ldap.initialize(Server)
l.protocol_version = 3
print l.simple_bind_s(DN, Secret)
r = l.search(Base, Scope, Filter, Attrs)
Type,user = l.result(r,60)
Name,Attrs = user[0]
if hasattr(Attrs, 'has_key') and Attrs.has_key('displayName'):
displayName = Attrs['displayName'][0]
print displayName
sys.exit()
Wenn [email protected] password username
ich dies mit ausführe, habe ich einen von zwei Fehlern:
Invalid Credentials
- Wenn ich falsch schreibe oder absichtlich falsche Anmeldeinformationen verwende, kann die Authentifizierung nicht durchgeführt werden.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, Kommentar: AcceptSecurityContext-Fehler, Daten 52e, vece', 'desc': 'Ungültige Anmeldeinformationen'}
Oder
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, Kommentar: Um diesen Vorgang auszuführen, muss eine erfolgreiche Bindung für die Verbindung abgeschlossen werden., Daten 0, vece', 'desc': 'Operations error '}
Was verpasse ich, um richtig zu binden?
Ich erhalte die gleichen Fehler auf Fedora und Windows.
Antworten:
ich habe gefehlt
Von der Init.
quelle
Wenn Sie für die Verwendung von pywin32 offen sind, können Sie Win32-Aufrufe von Python verwenden. Dies tun wir auf unserem CherryPy-Webserver:
quelle
Das hat bei mir funktioniert. L.set_option (ldap.OPT_REFERRALS, 0) war der Schlüssel für den Zugriff auf das ActiveDirectory. Darüber hinaus denke ich, dass Sie ein "con.unbind ()" hinzufügen sollten, um die Verbindung zu schließen, bevor Sie das Skript beenden.
quelle
LDAPObject
werden von zurückgegebeninitialize()
. Die Verbindung wird automatisch gelöst und geschlossen, wenn das LDAP-Objekt gelöscht wird.Hier ist ein einfacher Code, der für mich funktioniert.
Dies basiert auf einer vorherigen Antwort .
quelle
AttributeError: module 'ldap' has no attribute 'open'
Wenn Sie Kerberos installiert haben und mit AD sprechen, wie dies beispielsweise bei Centrify Express der Fall ist und ausgeführt wird, verwenden Sie möglicherweise nur Python-Kerberos. Z.B
würde True zurückgeben. Ein Benutzer 'joe' hat das Passwort 'pizza' im Kerberos-Bereich X.PIZZA.COM. (Ich denke, letzteres entspricht normalerweise dem Namen der AD-Domäne.)
quelle
Ich sehe Ihren Kommentar an @Johan Buret über den DN, der Ihr Problem nicht behebt, aber ich glaube auch, dass Sie sich darum kümmern sollten.
In Ihrem Beispiel lautet der DN für das Standardadministratorkonto in AD: cn = Administrator, cn = Benutzer, dc = meine Domäne, dc = co, dc = uk - versuchen Sie das bitte.
quelle
Basierend auf dem hervorragenden ldap3-Tutorial :
Ich habe das oben genannte in Python3 gemacht, aber es soll mit Python 2 kompatibel sein.
quelle
Ich habe versucht hinzuzufügen
aber statt eines Fehlers hängt Python einfach und reagiert auf nichts mehr. Vielleicht baue ich die Suchabfrage falsch. Was ist der Basisteil der Suche? Ich verwende das gleiche wie der DN für die einfache Bindung (oh, und ich musste
l.simple_bind
stattdessen tunl.simple_bind_s
):Ich verwende AD LDS und die Instanz ist für das aktuelle Konto registriert.
quelle
Ich hatte das gleiche Problem, aber es ging um die Passwortkodierung
Problem gelöst.
quelle
Verwenden Sie einen eindeutigen Namen, um sich bei Ihrem System anzumelden.
"CN=Your user,CN=Users,DC=b2t,DC=local"
Es sollte auf jedem LDAP-System einschließlich AD funktionierenquelle
Für mich hat der Wechsel von
simple_bind_s()
zubind()
den Trick gemacht.quelle