Обновите пароль Active Directory с помощью ldap python
В основном пытается сбросить пароль пользователя с помощью LDAP Python. Я прошел через различные посты здесь, но не повезло:(.
Пробовал с помощью:
a) modify_s () - каждый раз возвращает "Нет такого объекта". Пробовал с другим пользователем DN.
{'info': "0000208D: NameErr: DSID-0310020A, проблема 2001 (NO_OBJECT), данные 0, наилучшее совпадение:\n\t'DC=mydomain,DC=com'\n", 'matched': 'DC=mydomain,DC=com', 'desc': ' Нет такого объекта '}
Вот фрагмент кода:
def changePassword(userEmail, oldPassword, newPassword): try: ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) ldap_client = ldap.initialize("ldap://127.0.01.1:389") ldap_client.set_option(ldap.OPT_REFERRALS, 0) ldap_client.set_option(ldap.OPT_PROTOCOL_VERSION, 3) ldap_client.set_option(ldap.OPT_X_TLS,ldap.OPT_X_TLS_DEMAND) ldap_client.set_option( ldap.OPT_X_TLS_DEMAND, True ) ldap_client.set_option( ldap.OPT_DEBUG_LEVEL, 255 ) ldap_client.simple_bind_s(ADMIN_EMAIL, ADMIN_PASSWORD) # Set AD password #unicode_pass = unicode('\"' + newPassword + '\"', "iso-8859-1") unicode_pass = newPassword password_value = unicode_pass.encode("utf-16-le") add_pass = [(ldap.MOD_REPLACE, 'unicodePwd', [password_value]),( ldap.MOD_REPLACE, 'unicodePwd', [password_value])] # Replace password try: user_dn = 'CN=%s,DC=mydomain,DC=com' % username ldap_client.modify_s(user_dn, add_pass) print "Active Directory password for", username, \ "was set successfully!" except ldap.LDAPError, e: sys.stderr.write('Error setting AD password for: ' + username + '\n') sys.stderr.write('Message: ' + str(e) + '\n') ldap_client.unbind_s() return 'SOME_PROBLEM' ldap_client.unbind_s() return 'AUTHENTICATED' except ldap.INVALID_CREDENTIALS: ldap_client.unbind() return 'INVALID_CREDENTIALS' except ldap.SERVER_DOWN: return 'SERVER_UNAVAILABLE'
б)
passwd(userEmail, oldPassword, newPassword)
, Он выполняется хорошо, но пароль не обновляется.
Нужна помощь в выявлении проблемы.
Ссылки по теме: Python + LDAP + SSL
Python-LDAP и Microsoft Active Directory: подключить и удалить пользователя
как установить lockoutTime и пароль пользователя Active Directory
Как я могу изменить пароль для пользователя домена (Windows Active Directory), используя Python?
https://groups.google.com/forum/#!topic/macromedia.coldfusion.security/Rq7xx15OeBs
http://www.grotan.com/ldap/python-ldap-samples.html
http://marcitland.blogspot.in/2011/02/python-active-directory-linux.html
https://snipt.net/Fotinakis/change-active-directory-password-via-ldap-modify-call/
3 ответа
У меня возникла та же проблема, и я решил спросить об ошибке сервера. Ответ, который я получил, помог мне понять, что не так в моем коде. Подводя итог, можно использовать 2 различных способа обновления пароля AD: 1 для обычного пользователя, обновляющего свой пароль, и 1 для администратора (или любой учетной записи с достаточными правами доступа) для сброса пароля для другого пользователя.
Способ 1: пользователь обновляет свой пароль
ad_server = "ldaps://ad.xxx_domain.com"
ad_dn = "CN={0},OU=Users,OU=AF,DC=xxx_domain,DC=com"
username = 'my_username'
old_pwd = 'the_old_pa55word'
new_pwd = 'the_new_pa55word'
cert = os.path.join('/path', "to", 'server_cert.cer')
# LDAP connection initialization
l = ldap.initialize(ad_server)
# Set LDAP protocol version used
l.protocol_version = ldap.VERSION3
# Force cert validation
l.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_DEMAND)
# Set path name of file containing all trusted CA certificates
l.set_option(ldap.OPT_X_TLS_CACERTFILE, cert)
# Force libldap to create a new SSL context (must be last TLS option!)
l.set_option(ldap.OPT_X_TLS_NEWCTX, 0)
# Bind
l.simple_bind_s(ad_dn.format(username), old_pwd)
# Now, perform the password update
oldpwd_utf16 = '"{0}"'.format(old_pwd).encode('utf-16-le')
newpwd_utf16 = '"{0}"'.format(new_pwd).encode('utf-16-le')
mod_list = [
(ldap.MOD_DELETE, "unicodePwd", oldpwd_utf16),
(ldap.MOD_ADD, "unicodePwd", newpwd_utf16),
]
l.modify_s(ad_dn.format(username), mod_list)
Способ 2: учетная запись администратора обновляет пароль обычного пользователя
ad_server = "ldaps://ad.xxx_domain.com"
ad_dn = "CN={0},OU=Users,OU=AF,DC=xxx_domain,DC=com"
admin_username = "i_am_the_admin"
admin_password = "admin123"
username = 'my_username'
new_pwd = 'the_new_complicated_password'
cert = os.path.join('/path', "to", 'server_cert.cer')
# LDAP connection initialization
l = ldap.initialize(ad_server)
# Set LDAP protocol version used
l.protocol_version = ldap.VERSION3
# Force cert validation
l.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_DEMAND)
# Set path name of file containing all trusted CA certificates
l.set_option(ldap.OPT_X_TLS_CACERTFILE, cert)
# Force libldap to create a new SSL context (must be last TLS option!)
l.set_option(ldap.OPT_X_TLS_NEWCTX, 0)
# Bind (as admin user)
l.simple_bind_s(ad_dn.format(admin_username), admin_password)
# Now, perform the password update
newpwd_utf16 = '"{0}"'.format(new_pwd).encode('utf-16-le')
mod_list = [
(ldap.MOD_REPLACE, "unicodePwd", newpwd_utf16),
]
l.modify_s(ad_dn.format(username), mod_list)
Обратите внимание, что второй метод требует привязки с другой учетной записью (с достаточными правами), но позволяет установить новый пароль без повторного ввода старого.
Я думаю, что нижеприведенная программа полезна для вас. Windows Active Directory использует атрибут пароля в качестве метода Юникода https://technet.microsoft.com/en-us/magazine/ff848710.aspx
import ldap
import ldap.modlist as modlist
import base64
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
l = ldap.initialize('ldaps://exam.local')
l.simple_bind_s('Administrator@exam.local', 'p@ssw0rd1')
dn="cn=map6,ou=Police,dc=exam,dc=local"
new_password='p@ssw0rd3'
unicode_pass = unicode('\"' + new_password + '\"', 'iso-8859-1')
print (unicode_pass)
password_value = unicode_pass.encode('utf-16-le')
add_pass = [(ldap.MOD_REPLACE, 'unicodePwd', [password_value])]
print (password_value)
l.modify_s(dn, add_pass)
l.modify_s(dn, add_pass)
l.unbind_s()
Из того, что я вижу, является то, что ваш user_dn установлен неправильно. Дважды проверьте и убедитесь, что ваше полное DN действительно существует на сервере каталогов. Проверьте, правильно ли проанализирована ваша переменная имени пользователя (без символов новой строки или табуляции) и проверен ли базовый DN.
sys.stderr.write('Error setting AD password for: ' + username + '\n')
sys.stderr.write('DN: ' + user_dn + '\n')
sys.stderr.write('Message: ' + str(e) + '\n')
Сообщение об ошибке довольно ясно, что AD не может найти объект (DN), который он хочет изменить **(NO_OBJECT)
{'info': "0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT),
data 0, best match of:\n\t'DC=mydomain,DC=com'\n", 'matched':
'DC=mydomain,DC=com', 'desc': 'No such object'}