¿Cómo me autentico contra AD usando Python + LDAP? Actualmente estoy usando la biblioteca python-ldap y todo lo que produce son lágrimas.
Ni siquiera puedo enlazar para realizar una consulta simple:
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()
Ejecutar esto con [email protected] password username
me da uno de dos errores:
Invalid Credentials
- Cuando escribo mal o uso intencionalmente credenciales incorrectas, no se autentica.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comentario: Error de AcceptSecurityContext, datos 52e, vece', 'desc': 'Credenciales no válidas'}
O
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, comentario: Para realizar esta operación se debe completar un enlace exitoso en la conexión., data 0, vece', 'desc': 'Error de operaciones '}
¿Qué me estoy perdiendo para unir correctamente?
Recibo los mismos errores en Fedora y Windows.
Respuestas:
estaba perdido
Desde el init.
fuente
Si está dispuesto a usar pywin32, puede usar llamadas Win32 desde Python. Esto es lo que hacemos en nuestro servidor web CherryPy:
fuente
Eso funcionó para mí, l.set_option (ldap.OPT_REFERRALS, 0) fue la clave para acceder a ActiveDirectory. Además, creo que debería agregar un "con.unbind ()" para cerrar la conexión antes de terminar el script.
fuente
LDAPObject
son devueltas porinitialize()
. La conexión se desvincula automáticamente y se cierra cuando se elimina el objeto LDAP.Aquí hay un código simple que me funciona.
Esto se basa en una respuesta anterior .
fuente
AttributeError: module 'ldap' has no attribute 'open'
si tiene Kerberos instalado y hablando con AD, como sería el caso de, digamos, Centrify Express instalado y en ejecución, puede usar python-kerberos. P.ej
devolvería True un usuario 'joe' tiene la contraseña 'pizza' en el dominio Kerberos X.PIZZA.COM. (normalmente, creo, este último sería el mismo que el nombre del dominio AD)
fuente
Veo su comentario a @Johan Buret acerca de que el DN no soluciona su problema, pero también creo que eso es lo que debería investigar.
Dado su ejemplo, el DN para la cuenta de administrador predeterminada en AD será: cn = Administrador, cn = Usuarios, dc = mydomain, dc = co, dc = uk; por favor, inténtelo.
fuente
Basado en el excelente tutorial de LDAP3 :
Hice lo anterior en Python3 pero se supone que es compatible con Python 2.
fuente
Traté de agregar
pero en lugar de un error, Python simplemente se cuelga y ya no responde a nada. Tal vez estoy construyendo mal la consulta de búsqueda, ¿cuál es la parte Base de la búsqueda? Estoy usando lo mismo que el DN para el enlace simple (oh, y tuve que hacer
l.simple_bind
, en lugar del.simple_bind_s
):Estoy usando AD LDS y la instancia está registrada para la cuenta actual.
fuente
Tuve el mismo problema, pero estaba relacionado con la codificación de la contraseña.
Resuelve el problema.
fuente
Utilice un nombre distinguido para iniciar sesión en su sistema.
"CN=Your user,CN=Users,DC=b2t,DC=local"
Debería funcionar en cualquier sistema LDAP, incluido ADfuente
Para mí, cambiar de
simple_bind_s()
abind()
funcionó.fuente