2017-08-31 7 views
0

En préface, je n'ai travaillé qu'avec Python que pendant environ 5 mois. J'ai essayé d'écrire un programme qui (éventuellement) fera la création d'utilisateur en lots. Lorsqu'il est formaté comme ci-dessous, il créera avec succès un nouvel objet utilisateur, mais l'attribut "userAccountControl" sera 546, ACCOUNTDISABLE | PASSWD_NOTREQD | NORMAL_ACCOUNT et la valeur de "userPass" apparaîtra en texte brut comme une chaîne d'octets dans l'éditeur d'attributs de l'objet dans AD. Ce programme utilise la bibliothèque LDAP3: https://pypi.python.org/pypi/ldap3Python - Ajout d'un utilisateur AD avec "userPassword" et "userAccountControl" défini retourne LDAP 53 - "Ne veut pas effectuer"

class fromconfig: 
    def __init__(self): 
     Config = configparser.ConfigParser() 
     Config.read("config.ini") 
     self.serverip = Config.get('serverinfo', 'ip') 
     self.basepath = Config.get('serverinfo', 'base') 
     self.container = Config.get('serverinfo', 'container') 
     self.dc1 = Config.get('serverinfo', 'dc1') 
     self.dc2 = Config.get('serverinfo', 'dc2') 
     self.ou = Config.get('serverinfo', 'ou') 

def add_user(username, givenname, surname, userPrincipalName, SAMAccountName, userPassword): 

    ad_server = Server(config.serverip, use_ssl=True, get_info=ALL) 

    ad_c = Connection(ad_server, user='domain\\user', password='password', authentication=NTLM) 

    if ad_c.bind(): 
     ad_c.add('cn={},cn={},dc={},dc={}'.format(username, config.ou, config.dc1, config.dc2), ['person', 'user'], {'givenName': givenname, 'sn': surname, 'userPrincipalName': userPrincipalName, 'sAMAccountName': SAMAccountName, 'userPassword': userPassword}) 
     print(ad_c.result) 

    ad_c.unbind() 

Je veux être en mesure de définir une valeur 512 pour userAccountControl dans le programme, ou autrement permettre avec succès le compte pour que je ne dois pas revenir en arrière à travers et décochez "Compte est désactivé" dans AD plus tard. Lorsque j'essaie de le transmettre, ad_c.result renvoie une erreur 53. C'est la même erreur que je reçois lorsque j'entre dans AD et j'essaie de modifier l'attribut directement, ou décochez la case désactiver le compte. La boîte de dialogue pour l'erreur 53 sur le serveur AD indique "Le mot de passe ne répond pas aux exigences de longueur ou de complexité", mais le mot de passe que j'utilise pour mes tests est celui que j'ai utilisé sans problème. Je pense donc que le problème a quelque chose à voir avec la façon dont userPassword est stocké plutôt qu'avec la complexité ou les permissions.

Répondre

0

Je crois que je l'ai compris, grâce à l'exemple de this. Définir une valeur pour la clé "userPassword" dans le dictionnaire des attributs ne fonctionnera pas plus tard lorsque vous allez activer manuellement le compte. Au lieu de cela, après avoir ajouté le compte utilisateur, vous pouvez utiliser les opérations étendues pour déverrouiller le compte, modifier le mot de passe, puis mettre à jour l'attribut "userAccountControl" avec la valeur désirée (dans ce cas, 512: NORMAL_ACCOUNT).

Il est extrêmement compliqué, mais heureusement cela fonctionne, donc je vais maintenant commencer refactorisation le reste du programme il ne semble pas hideux

(continued from above) 
    ad_c.add(...) 
    ad_c.extend.microsoft.unlock_account(user='cn={},cn={},dc={},dc={}'.format(username, config.container, config.dc1, config.dc2)) 
    ad_c.extend.microsoft.modify_password(user='cn={},cn={},dc={},dc={}'.format(username, config.container, config.dc1, config.dc2), new_password=userpassword, old_password=None) 
    changeUACattribute = {"userAccountControl": (MODIFY_REPLACE, [512])} 
    ad_c.modify('cn={},cn={},dc={},dc={}'.format(username, config.container, config.dc1, config.dc2), changes=changeUACattribute)