Как я могу изменить пароль для пользователя домена (Windows Active Directory), используя Python?

Как я могу изменить пароль для пользователя домена с Python? У меня есть модули ldap на борту, но у меня нет решения. Мне удалось запросить текущие настройки через ldap, но как это можно изменить?

import ldap
import sys

host = 'ldap://10.172.0.79'

con = ldap.initialize(host)
BIND_DN = "administrator@biztalk.com"
BIND_PASS = "a-123456"
con.set_option( ldap.OPT_X_TLS_DEMAND, True )
con.set_option( ldap.OPT_DEBUG_LEVEL, 255 )

PASSWORD_ATTR = "unicodePwd"
username="bizadmin"
user_dn = "CN=%s,OU=User,OU=biztalk,DC=biz-talk,DC=com" % username
password = 'New12345'

# Set AD password
unicode_pass = unicode("\"" + password + "\"", "iso-8859-1")
password_value = unicode_pass.encode("utf-16-le")
add_pass = [(ldap.MOD_REPLACE, PASSWORD_ATTR, [password_value])]

# Replace password
try:
    con.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')
    sys.exit(1)

ошибка

отладчик pydev: запуск

Ошибка установки пароля AD для: bizadmin

Сообщение: {'desc': "Не удается связаться с сервером LDAP"}


Python изменить домен (Microsoft Active Directory) пароль пользователя.

... требуются услуги сертификации между питоном и доменом?

Не могли бы вы иметь какие-нибудь хорошие способы справиться с этим?

Спасибо!

3 ответа

Решение

Python не мой язык, но я изменяю пароль Active-Directory через LDAP.

Что касается вашего URL:

Ваш URL LDAP должен быть таким:

host = 'LDAP://10.172.0.79/dc=directory,dc=example,dc=com'

С 'LDAP', а не с 'ldap' и хорошим путем к каталогу.

Что касается пароля:

Во-первых: насколько я понимаю, вы можете изменить пароль AD unicode_pass только если у вашего сервера есть сертификат и если вы связываетесь через LDAPS (SSL).

Второе: пароль дается с двойным паролем. Test.2006 становится "test.2006".

Третье: результат должен быть закодирован в Unicode.


Отредактировано:

После того, как вы установили сервер сертификатов, вам просто нужно перезагрузить сервер, чтобы AD ожидал на порту 636 (LDAPS). На стороне Python вот что я нашел:

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
l = ldap.initialize("LDAPS://10.172.0.79:636")
l.set_option(ldap.OPT_REFERRALS, 0)
l.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
l.set_option(ldap.OPT_X_TLS,ldap.OPT_X_TLS_DEMAND)
l.set_option( ldap.OPT_X_TLS_DEMAND, True )
l.set_option( ldap.OPT_DEBUG_LEVEL, 255 )
l.simple_bind_s("admin@tester.com","password")

Этот код работает с Windows 2012 R2 AD:

Сначала установите последний пакет ldap3: sudo pip install ldap

#!/usr/bin/python

import ldap3

SERVER='127.0.0.1'
BASEDN="DC=domain,DC=com"
USER="user_domain_login_name@domain.com"
CURREENTPWD="current_password"
NEWPWD="new_password"

SEARCHFILTER='(&(userPrincipalName='+USER+')(objectClass=person))'

USER_DN=""
USER_CN=""

ldap_server = ldap3.Server(SERVER, get_info=ldap3.ALL)
conn = ldap3.Connection(ldap_server, USER, CURREENTPWD, auto_bind=True)
conn.start_tls()
#print conn
conn.search(search_base = BASEDN,
         search_filter = SEARCHFILTER,
         search_scope = ldap3.SUBTREE,
         attributes = ['cn', 'givenName', 'userPrincipalName'],
         paged_size = 5)

for entry in conn.response:
    if entry.get("dn") and entry.get("attributes"):
        if entry.get("attributes").get("userPrincipalName"):
            if entry.get("attributes").get("userPrincipalName") == USER:
                USER_DN=entry.get("dn")
                USER_CN=entry.get("attributes").get("cn")

print "Found user:", USER_CN
print USER_DN
print ldap3.extend.microsoft.modifyPassword.ad_modify_password(conn, USER_DN, NEWPWD, CURREENTPWD,  controls=None)

Код смены пароля выглядит идеально.

Вы не связываете после инициализации. обязательна

con.simple_bind_s(user, pass)

Кроме того, для начала вы можете игнорировать ошибки сертификата для привязки, установив эту опцию. Как только вы сможете обновить пароль, вы можете укрепить сертификат, если хотите.

con.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
Другие вопросы по тегам