Cambiar la contraseña de usuario de Active Directory en Python 3.x

Estoy tratando de crear un script de Python que abra una conexión LDAP a un servidor que ejecute AD, tome una entrada de búsqueda (en este caso, un nombre), busque esa entrada y cambie la contraseña de los usuarios a una contraseña generada aleatoriamente (así como configure la opción para cambiar la contraseña al iniciar sesión) y luego envíeles un correo electrónico seguro automático que contenga la nueva contraseña temporal.

Hasta ahora he podido conectarme al servidor y buscar un solo DN que regrese. Se está generando la contraseña temporal y se está enviando un correo electrónico (aunque la contraseña no está cifrada y el correo electrónico aún no es seguro). Sin embargo, no puedo encontrar ninguna información sobre dónde ir desde aquí.

he encontradoCambiar la contraseña de usuario de Windows con Python Sin embargo, veo que esto no funciona bien con AD, y el otro LDAP en la documentación de Python que he encontrado parece estar desactualizado de 2.xy ya no funciona. La documentación para ldap3 (https://media.readthedocs.org/pdf/ldap3/stable/ldap3.pdf) tampoco parece mencionar realmente nada al respecto, y Google exhaustivo ha sido infructuoso. Soy nuevo en este tipo de programación que solo tenía conocimientos académicos o de bajo nivel anteriormente, así que esto ha sido un poco frustrante, pero Python es mi lenguaje más fuerte.

---------------- CÓDIGO EDITADO AL ESTADO ACTUAL -----------------------

#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)

¿Alguna sugerencia sobre cómo obtener / establecer la contraseña de usuario y el hash de la contraseña por motivos de seguridad durante toda esta prueba? Para el correo electrónico, imagino que puedo forzarlo a usar HTTPS y eso sería suficiente, pero la conexión al servidor que pasa la nueva contraseña me gustaría asegurarla.

Respuestas a la pregunta(2)

Su respuesta a la pregunta