Изменение паролей Active Directory с помощью ldapmodify
Я исследую сценарии различных операций LDAP. Тем не менее, я столкнулся с небольшим скачком скорости при создании пользователей Active Directory.
Следующий LDIF не работает, когда я загружаю его через ldapmodify
команда:
dn: CN=Frank,CN=Users,DC=domain,dc=local
changeType: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Frank
userPrincipalName: frank@domain.local
sAMAccountName: frank
givenName: Frank
sn: Stein
displayName: Frank Stein
description: Frankenstein's User
userAccountControl: 512
unicodePwd: "AnExamplePassword1!"
При попытке добавить пользователя через LDIF я использовал следующую команду:
ldapmodify -H 'ldaps://<ip-of-server>:636' -D 'DOMAIN\Administrator' -x -W -f frank-add.ldif
Это терпит неудачу со следующей ошибкой:
ldap_add: Server is unwilling to perform (53)
additional info: 0000001F: SvcErr: DSID-031A120C, problem 5003 (WILL_NOT_PERFORM), data 0
Это проблема политики паролей, запрещающей пользователю.
Однако работает следующий скрипт Python:
#!/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("%s@domain.local" % username)
attrs['userAccountControl'] = str(512)
ldif = modlist.addModlist(attrs)
l.add_s(dn,ldif)
Используя скрипт Python, я сразу же могу войти, используя пароль пользователя (за исключением кавычек, которые были экранированы). Я все еще могу вызвать ту же ошибку "Нежелание выполнить", выбрав слишком простой пароль типа "пароль". Однако в этом случае используемый пароль остается тем же.
Насколько я вижу, операции должны быть идентичными. Разница, которая нарушает файл LDIF, заключается в том, что я работаю с кавычками, в которые мне нужно вложить пароль. Создание через LDIF завершается успешно, если я делаю отключенную учетную запись, устанавливая значение userAccountControl равным 544 и не включая пароль. Однако это означает, что мне нужно будет вручную перейти и сбросить пароль пользователя.
До сих пор я пробовал следующие форматы паролей через LDIF:
- Без кавычек.
- Простые цитаты.
- Побег цитаты через \
- Экранированные кавычки через ASCII: {\22}
- Использование Python для Base64-кодирования пароля (с кавычками и без них и с форматом LDIF, измененным на
unicodePwd::
)
Хотя я счастлив, что у меня есть рабочий метод добавления пользователей через Python, я все еще немного озадачен тем, как правильно экранировать значения паролей при использовании файлов LDIF и ldapmodify
, Есть ли альтернативный метод, который я не рассматриваю?
1 ответ
Почему бы не использовать ldifde и unicode base64 для кодирования пароля, как описано здесь: http://support.microsoft.com/kb/263991
Ваш скрипт на python, похоже, кодирует пароль как unicode / base64. Возможно, ваш пароль должен быть закодирован в вашем файле ldif (с кавычками при кодировании), а не в виде обычного текста, как вы делаете в своем примере.
Например:
unicodePwd:: IgBBAG4ARQB4AGEAbQBwAGwAZQBQAGEAcwBzAHcAbwByAGQAMQAhACIA
Для примера пароль, который вы предоставили.