Alterando a senha de usuário do Active Directory no Python 3.x
Estou tentando criar um script Python que abrirá uma conexão LDAP com um servidor executando o AD, faça uma entrada de pesquisa (nesse caso, um nome), procure essa entrada e altere a senha dos usuários para uma senha gerada aleatoriamente (bem como defina a opção de alterar a senha no logon) e envie a eles um email seguro automático contendo a nova senha temporária.
Até agora, consegui me conectar ao servidor e procurar um único DN que retorne. A senha temporária está sendo gerada e um email está sendo enviado (embora a senha não esteja em hash e o email ainda não esteja seguro). No entanto, não consigo encontrar nenhuma informação sobre para onde ir a partir daqui.
eu encontreiAlterar senha de usuário do Windows com python no entanto, vejo que isso não funciona bem com o AD, e o outro LDAP na documentação do Python que encontrei parece estar desatualizado do 2.xe não funciona mais. A documentação para ldap3 (https://media.readthedocs.org/pdf/ldap3/stable/ldap3.pdf) também não parece realmente mencionar nada, e o Google exaustivo foi infrutífero. Eu sou novo nesse tipo de programação, com apenas conhecimento acadêmico ou de baixo nível anteriormente, então isso tem sido um pouco frustrante, mas Python é a minha linguagem mais forte.
---------------- CÓDIGO EDITADO PARA ESTADO ATUAL -----------------------
#Takes input for name which will be used for search criterion
zid = input("ZID: ")
zid = str(zid).lower()
print(zid)
#Binds session to the server and opens a connection
try:
server = ldap3.Server('ldap://<IP_Address>', get_info=all)
conn = ldap3.Connection(server, '%[email protected]' %zid, password = "<something>", auto_bind=True)
print("Successfully bound to server.\n")
except:
print("Unsucessful initialization of <IP_Address>")
try:
server = ldap3.Server('ldap://<IP_Address>', get_info=all)
conn = ldap3.Connection(server, '%[email protected]' %zid, password = "<something>", auto_bind=True)
print("Successfully bound to server.\n")
except:
print("Unsucessful initialization of <IP_Address>")
try:
server = ldap3.Server('ldap://<IP_Address>', get_info=all)
conn = ldap3.Connection(server, '%[email protected]', password = "<something>", auto_bind=True) %zid
print("Successfully bound to server.\n")
except:
print("Unsucessful initialization of <IP_Address>")
sys.exit(0)
#Searches and prints LDAP entries
try:
base_dn = 'DC=<something>,DC=<something>,DC=<something>,DC=<something>,DC=com'
zid_filter = '(sAMAccountName=%s)' %zid
conn.search(base_dn, zid_filter, attributes=['mail'])
#i.e. "DN: CN=<First Last>,OU=<something>, DC= <something>
user_dn = str(conn.entries)
#i.e. "CN=<First Last>"
front = user_dn.find('C')
back = user_dn.find(',')
user_cn = user_dn[front:back]
#i.e. "<First Last>"
display_name = user_cn[3:]
#i.e. "first.last@<something>.com"
raw_email = str(conn.entries)
front = raw_email.find('mail: ')
back = raw_email.find('@<something>.com')
user_email = raw_email[front + 6:back] + '@<something>.com'
except:
print("Could not search entries")
#Generates random 12 digit alpha-numeric password
try:
new_password = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(12))
print(new_password)
print("New password successfully generated")
except:
print("New password could not be generated")
#Set and replace AD Password
try:
conn.extend.microsoft.modify_password(user_dn, None, new_password)
print ("Active Directory password was set successfully!")
except:
print('Error setting AD password')
sys.exit(0)
Alguma sugestão sobre como obter / definir a senha do usuário e hash a senha para fins de segurança durante todo este calvário? Para o email, imagino que posso forçá-lo a usar HTTPS e isso seria suficiente, mas a conexão com o servidor que está passando a new_password para a qual gostaria de proteger.