Como faço para autenticar no AD usando Python + LDAP. Atualmente estou usando a biblioteca python-ldap e tudo o que ela está produzindo são lágrimas.
Não consigo nem fazer uma consulta simples:
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()
Executá-lo com [email protected] password username
resulta em um de dois erros:
Invalid Credentials
- Quando eu digito incorretamente ou uso intencionalmente credenciais incorretas, a autenticação falha.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comentário: Erro AcceptSecurityContext, dados 52e, vece', 'desc': 'Credenciais inválidas'}
Ou
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, comentário: Para realizar esta operação, um vínculo bem-sucedido deve ser concluído na conexão., dados 0, vece', 'desc': 'Erro de operações '}
O que estou perdendo para vincular corretamente?
Estou recebendo os mesmos erros no fedora e no windows.
Respostas:
Estava faltando
Do init.
fonte
Se você estiver aberto para usar o pywin32, poderá usar chamadas Win32 do Python. Isso é o que fazemos em nosso servidor da web CherryPy:
fonte
Isso funcionou para mim, l.set_option (ldap.OPT_REFERRALS, 0) era a chave para acessar o ActiveDirectory. Além disso, acho que você deve adicionar um "con.unbind ()" para fechar a conexão antes de terminar o script.
fonte
LDAPObject
são retornadas porinitialize()
. A conexão é automaticamente desassociada e fechada quando o objeto LDAP é excluído.Aqui está um código simples que funciona para mim.
Isso é baseado em uma resposta anterior .
fonte
AttributeError: module 'ldap' has no attribute 'open'
se você tiver o Kerberos instalado e conversando com o AD, como seria o caso, digamos, do Centrify Express instalado e em execução, você pode apenas usar o python-kerberos. Por exemplo
retornaria True se o usuário 'joe' tiver a senha 'pizza' no domínio Kerberos X.PIZZA.COM. (normalmente, eu acho, o último seria o mesmo que o nome do domínio AD)
fonte
Vejo seu comentário para @Johan Buret sobre o DN não resolver seu problema, mas também acredito que é isso que você deve examinar.
Dado o seu exemplo, o DN para a conta de administrador padrão no AD será: cn = Administrador, cn = Usuários, dc = meudominio, dc = co, dc = uk - tente isso.
fonte
Com base no excelente tutorial do ldap3 :
Eu fiz o acima em Python3, mas é suposto ser compatível com Python 2.
fonte
Tentei adicionar
mas em vez de um erro, o Python apenas trava e não responde mais a nada. Talvez eu esteja criando a consulta de pesquisa incorreta. Qual é a parte Base da pesquisa? Estou usando o mesmo DN para o vínculo simples (ah, e tive que fazer
l.simple_bind
, em vez del.simple_bind_s
):Estou usando o AD LDS e a instância está registrada para a conta corrente.
fonte
Eu tive o mesmo problema, mas foi em relação à codificação de senha
Resolveu o problema.
fonte
Use um nome distinto para fazer logon no seu sistema.
"CN=Your user,CN=Users,DC=b2t,DC=local"
Deve funcionar em qualquer sistema LDAP, incluindo ADfonte
Para mim, mudar de
simple_bind_s()
parabind()
funcionou.fonte