Wie authentifiziere ich mich gegen AD mit Python + LDAP? Ich verwende derzeit die Python-ldap-Bibliothek und produziert nur Tränen.
Ich kann nicht einmal binden, um eine einfache Abfrage auszufü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()
Das Ausführen mit [email protected] password username
gibt mir einen von zwei Fehlern:
Invalid Credentials
- Wenn ich falsch schreibe oder absichtlich falsche Anmeldeinformationen verwende, konnte ich mich nicht authentifizieren.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, Kommentar: AcceptSecurityContext-Fehler, Daten 52e, Vece', 'desc': 'Ungültige Berechtigungsnachweise'}
Oder
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, Kommentar: Damit diese Operation ausgeführt werden kann, muss eine erfolgreiche Bindung für die Verbindung hergestellt werden., data 0, vece', 'desc': 'Operationsfehler '}
Was verpasse ich, um richtig zu binden?
Ich bekomme die gleichen Fehler in Fedora und Windows.
Ich habe gefehlt
l.set_option(ldap.OPT_REFERRALS, 0)
Von der init.
Wenn Sie pywin32 verwenden möchten, können Sie Win32-Aufrufe von Python aus verwenden. Das machen wir auf unserem CherryPy-Webserver:
import win32security
token = win32security.LogonUser(
username,
domain,
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT)
authenticated = bool(token)
Das funktionierte für mich: l.set_option (ldap.OPT_REFERRALS, 0) war der Schlüssel zum Zugriff auf 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.
Hier ist ein einfacher Code, der für mich funktioniert.
import ldap # run 'pip install python-ldap' to install ldap module.
conn = ldap.open("ldaphost.company.com")
conn.simple_bind_s("[email protected]", "mypassword")
Dies basiert auf einer vorherigen Antwort .
wenn Sie Kerberos installiert haben und mit AD sprechen, wie z. B. Centrify Express installiert ist und ausgeführt wird, können Sie Python-Kerberos verwenden. Z.B.
import kerberos
kerberos.checkPassword('joe','pizza','krbtgt/x.pizza.com','X.PIZZA.COM')`
würde zurückgeben, dass ein Benutzer "Joe" das Kennwort "Pizza" im Kerberos-Realm X.PIZZA.COM . hat.
Ich sehe Ihren Kommentar an @Johan Buret, dass der DN Ihr Problem nicht behoben hat, 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 = meineDomäne, dc = co, dc = uk.
Ich habe versucht hinzuzufügen
l.set_option (ldap.OPT_REFERRALS, 0)
aber statt eines Fehlers hängt Python einfach und reagiert nicht mehr auf irgendetwas. Vielleicht baue ich die Suchabfrage falsch auf. Was ist der Basisteil der Suche? Ich verwende dasselbe wie den DN für das einfache Binden (oh, und ich musste l.simple_bind
statt l.simple_bind_s
tun):
import ldap
local = ldap.initialize("ldap://127.0.0.1")
local.simple_bind("CN=staff,DC=mydomain,DC=com")
#my pc is not actually connected to this domain
result_id = local.search("CN=staff,DC=mydomain,DC=com", ldap.SCOPE_SUBTREE, "cn=foobar", None)
local.set_option(ldap.OPT_REFERRALS, 0)
result_type, result_data = local.result(result_id, 0)
Ich verwende AD LDS und die Instanz ist für das aktuelle Konto registriert.
Ich hatte das gleiche Problem, aber es ging um die Passwortverschlüsselung
.encode('iso-8859-1')
Problem gelöst.
Für mich war der Wechsel von simple_bind_s()
zu bind()
der Trick.
Verwenden Sie einen Distinguished Name, um sich an Ihrem System anzumelden. "CN=Your user,CN=Users,DC=b2t,DC=local"
Es sollte auf jedem LDAP-System, einschließlich AD, funktionieren
Basierend auf dem ausgezeichneten ldap3 Tutorial :
>>> from ldap3 import Server, Connection, ALL, NTLM
>>> server = Server('server_name_or_ip', get_info=ALL)
>>> conn = Connection(server, user="user_name", password="password", auto_bind=True)
>>> conn.extend.standard.who_am_i()
>>> server.info
Ich habe das oben in Python3 gemacht, aber es sollte mit Python 2 kompatibel sein.