我有以下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条目是正确的 – 就像在内部帐户pipe理系统上显示的一样。 我得到这个错误,因为它是一个pipe理员密码,需要以不同的方式处理? 任何帮助将不胜感激。
显而易见的问题是,你是否在有权修改帐户的用户的情况下运行此操作?
除非您的域名没有安全性 – 这看起来像一个AD域名 – 您需要绑定一个有效的帐户,该帐户将需要修改另一个帐户的权限。
其次:对于Windows域,如果您没有先使用NTLM或Kerberos进行身份validation,则必须通过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,那么我强烈build议使用PyAD模块,该模块使用的ADSI风格的方法比普通的LDAP要好得多。 https://zakird.com/pyad/index.html