2014-01-23 10 views
5

Ich untersuche das Scripting von verschiedenen LDAP-Operationen. Allerdings habe ich bei der Active Directory-Benutzererstellung eine kleine Geschwindigkeitsschwelle erreicht.Ändern von Active Directory Passwörtern über ldapmodify

Die folgende LDIF schlägt fehl, wenn ich es über den ldapmodify Befehl laden in:

dn: CN=Frank,CN=Users,DC=domain,dc=local 
changeType: add 
objectClass: top 
objectClass: person 
objectClass: organizationalPerson 
objectClass: user 
cn: Frank 
userPrincipalName: [email protected] 
sAMAccountName: frank 
givenName: Frank 
sn: Stein 
displayName: Frank Stein 
description: Frankenstein's User 
userAccountControl: 512 
unicodePwd: "AnExamplePassword1!" 

Wenn der Benutzer über LDIF hinzuzufügen versucht, habe ich den folgenden Befehl ein:

ldapmodify -H 'ldaps://<ip-of-server>:636' -D 'DOMAIN\Administrator' -x -W -f frank-add.ldif 

Dies scheitert mit der folgende Fehler:

ldap_add: Server is unwilling to perform (53) 
     additional info: 0000001F: SvcErr: DSID-031A120C, problem 5003 (WILL_NOT_PERFORM), data 0 

Das ist ein Problem mit dem Kennwort po Verweigern den Benutzer.

jedoch der folgende Python-Skript funktioniert:

#!/usr/bin/python 

import ldap 
import ldap.modlist as modlist 

AD_LDAP_URL='ldaps://<ip-of-server>:636' 
ADMIN_USER='DOMAIN\Administrator' 
# User must be authorized to create accounts, naturally. 
ADMIN_PASSWORD='password for ADMIN_USER' 
BASE_DN='dc=domain,dc=local' 

username='frank' 
firstname='Frank' 
surname='Stein' 
displayName = "Frank Stein" 

password='AnExamplePassword1!' 
# The value of password still needs to adhere to the domain's password policy. 
unicode_pass = unicode('\"' + password + '\"', 'iso-8859-1') 
password_value = unicode_pass.encode('utf-16-le') 

l = ldap.initialize(AD_LDAP_URL) 
l.simple_bind_s(ADMIN_USER, ADMIN_PASSWORD) 

dn=str('CN=%s,CN=Users,DC=domain,dc=local' % firstname) 

attrs = {} 

attrs['objectclass'] = ['top','person','organizationalPerson','user'] 
attrs['cn'] = str(username) 
attrs['sAMAccountname'] = str(username) 
attrs['unicodePwd'] = str(password_value) 
attrs['givenName'] = str(firstname) 
attrs['sn'] = str(surname) 
attrs['displayName'] = str(displayName) 
attrs['description'] = str("Frankenstein's User") 
attrs['userPrincipalName'] = str("%[email protected]" % username) 
attrs['userAccountControl'] = str(512) 

ldif = modlist.addModlist(attrs) 
l.add_s(dn,ldif) 

den Python-Skript verwenden, bin ich sofort in der Lage des Kennwort des Benutzers bei der Verwendung (minus die Anführungszeichen, die entronnen waren) zu unterzeichnen. Ich kann immer noch den gleichen "Unwillig zu machen" -Fehler auslösen, indem ich ein Passwort wie "Passwort" auswähle, das zu einfach ist. In diesem Fall ist das verwendete Passwort jedoch identisch.

Soweit ich sehen kann, sollten die Operationen identisch sein. Der Unterschied, der die LDIF-Datei unterbricht, ist die Art und Weise, wie ich mit den Anführungszeichen verfahren muss. Die Erstellung über LDIF ist erfolgreich, wenn ich einen deaktivierten Account durch Setzen des Wertes von userAccountControl auf 544 und ohne ein Passwort einstelle. Dies bedeutet jedoch, dass ich das Passwort des Benutzers manuell zurücksetzen müsste.

Bisher habe ich folgende Passwort-Formate über LDIF versucht:

  • ohne Anführungszeichen.
  • Einfache Anführungszeichen.
  • Entkommen Zitate über \
  • Entkommen Zitate über ASCII: {\ 22}
  • Verwendung von Python zu Base64-codieren das Passwort (mit und ohne Anführungszeichen, und mit dem Format des LDIF zu unicodePwd:: modifiziert)

Während ich glücklich bin, dass ich eine funktionierende Methode des Hinzufügens von Benutzern über die Python habe, bin ich immer noch ein wenig verwirrt darüber, wie Passwörter bei der Verwendung von LDIF-Dateien und ldapmodify richtig zu entkommen. Gibt es eine alternative Methode, die ich nicht in Betracht ziehe?

Antwort

3

Warum nicht ldifde und Unicode-base64 kodieren, um das Kennwort, wie hier beschrieben: http://support.microsoft.com/kb/263991

Ihr Python-Skript scheint, als Unicode/Base64 codiert, um das Passwort zu werden. Vielleicht muss Ihr Passwort in Ihrer ldif-Datei (mit den Anführungszeichen beim Encodieren) codiert werden, anstatt in reinem Text, wie Sie es in Ihrem Beispiel tun.

ZB:

unicodePwd:: IgBBAG4ARQB4AGEAbQBwAGwAZQBQAGEAcwBzAHcAbwByAGQAMQAhACIA 

Für das Beispiel Passwort, das Sie zur Verfügung gestellt.

+0

Ich habe versucht, das Passwort mit Anführungszeichen zu kodieren, aber meine Methode für die Codierung muss ausgeschaltet sein. Ich habe versucht, mein Passwort in Python mit 'base64.b64encode (Unicode (" AnExamplePassword1! "))' 'Zu verschlüsseln, was' IkFuRXhhbXBsZVBhc3N3b3JkMSEi' ergab. Ich konnte den Benutzer über LDIF mit Ihrer Version des Passworts erfolgreich hinzufügen. – Gadgeteering

+1

Ich konnte den Wert von unicodePwd generieren, indem ich die Methode des Python-Skripts zur genaueren Passwortgenerierung befolge. Ich nahm etwas von der Zeichencodierung als selbstverständlich hin, weil es beim Drucken unverändert erschien. Ich habe die gleichen Schritte wie im Python-Skript durchgeführt und dann 'base64.b64encode (password_value)' verwendet. Dies gab mir deinen 'IgBB ...' Wert. – Gadgeteering

+0

Haben Sie das Passwort nach der Erstellung getestet? – Damien