Изменение паролей 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: [email protected]
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("%[email protected]" % 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. Есть ли альтернативный метод, который я не рассматриваю?


person Gadgeteering    schedule 23.01.2014    source источник


Ответы (1)


Почему бы не использовать ldifde и unicode base64 для кодирования пароля, как описано здесь: http://support.microsoft.com/kb/263991

Кажется, ваш скрипт python кодирует пароль как unicode / base64. Возможно, ваш пароль должен быть закодирован в вашем файле ldif (с кавычками при кодировании), а не в виде обычного текста, как вы делаете в своем примере.

Eg:

unicodePwd:: IgBBAG4ARQB4AGEAbQBwAGwAZQBQAGEAcwBzAHcAbwByAGQAMQAhACIA

Для примера пароля, который вы указали.

person Damien    schedule 26.01.2014
comment
Я пробовал закодировать пароль в кавычки, но мой метод кодирования должен быть отключен. Я попытался закодировать свой пароль в Python, используя base64.b64encode(unicode("\"AnExamplePassword1!\"")), что дало IkFuRXhhbXBsZVBhc3N3b3JkMSEi. Мне удалось успешно добавить пользователя через LDIF с вашей версией пароля. - person Gadgeteering; 26.01.2014
comment
Мне удалось сгенерировать ваше значение unicodePwd, более точно следуя методу моего скрипта Python для генерации пароля. Я принимал некоторую кодировку символов как должное, потому что она не изменилась при печати. Я проделал все те же шаги, что и в сценарии Python, а затем использовал base64.b64encode(password_value). Это дало мне вашу ценность IgBB.... - person Gadgeteering; 26.01.2014
comment
Вы проверяли пароль после создания? - person Damien; 27.01.2014
comment
Я подтвердил, что пароль верен. Я могу войти на рабочую станцию ​​с учетной записью, созданной LDIF, используя назначенный пароль AnExamplePassword1! (без кавычек). - person Gadgeteering; 27.01.2014
comment
Хорошая работа..! Мне очень жаль, что я неправильно прочитал ваш вопрос, в котором вы заявили, что уже пробовали кодировать. Удачного дня / ночи / и т. Д. :) - person Damien; 27.01.2014
comment
Я пробовал кодировать, но делал это неправильно, прыгая прямо на Base64 для файла LDIF. Ваш ответ заставил меня пересмотреть свой процесс и дал мне правильное значение для сравнения моих результатов. Спасибо. :) - person Gadgeteering; 27.01.2014