我有以下 python 脚本来更新 LDAP 密码。
import ldap
from ldap import LDAPError
user_dn = "CN=******,OU=Admins,OU=Example Users,DC=Example,DC=com"
old_password = "pass01"
new_password = "pass02"
def change_password(user_dn, old_password, new_password):
#ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,0)
#l = ldap.initialize("ldap://ds.example.com:3268")
l = ldap.initialize("ldap://ds.example.com:389")
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)
try:
l.simple_bind_s("[email protected]", old_password)
except ldap.LDAPError, e:
print "LDAP error1: {}".format(e)
# Reset Password
unicode_pass = unicode('\"' + str(new_password) + '\"', 'iso-8859-1')
password_value = unicode_pass.encode('utf-16-le')
add_pass = [(ldap.MOD_REPLACE, 'unicodePwd', [password_value])]
try:
l.modify_s(user_dn,add_pass)
except ldap.LDAPError, e:
print "LDAP error2: {}".format(e)
l.unbind_s()
change_password(user_dn, old_password, new_password)
这引发了第二个例外:
LDAP error2: {'info': 'Referral:\nldap://example.com/CN=*******,OU=Admins,OU=Example%20Users,DC=example,DC=com', 'desc': 'Referral'}
user_dn 条目是正确的 - 与内部帐户管理系统上显示的完全一样。我收到此错误是因为它是管理员密码并且需要以不同方式处理吗?任何帮助都将不胜感激。
答案1
显而易见的问题:您是否在有权更改帐户的用户上下文中运行此操作?
除非您的域没有安全性 - 这看起来像一个 AD 域 - 否则您需要绑定一个有效帐户,并且该帐户需要具有修改另一个帐户的权限。
第二:对于 Windows 域,如果您没有先使用 NTLM 或 Kerberos 进行身份验证,则必须通过 SSL 执行此操作。https://support.microsoft.com/en-au/help/269190/how-to-change-a-windows-active-directory-and-lds-user-password-through-ldap
最后,如果您必须使用 Python 而不是 .NET 或 Powershell,我强烈建议使用 PyAD 模块,它使用比普通 LDAP 好得多的 ADSI 样式的方法。https://zakird.com/pyad/index.html