首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python代码更新AD密码: INSUFF_ACCESS_RIGHTS

从python代码更新AD密码: INSUFF_ACCESS_RIGHTS
EN

Server Fault用户
提问于 2018-10-26 09:09:09
回答 1查看 4.6K关注 0票数 0

我需要在Python应用程序(Flask)中实现一个“更新密码”功能。目标是允许用户在远程服务器上自我更新密码.

我以快速单元测试结束

代码语言:javascript
复制
import os
import ldap

def test_change_passwd():
    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_complicated_password'
    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
    l.simple_bind_s(ad_dn.format(username), old_pwd)

    # 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)

当我运行它时,它会在最后一行(l.modify_s())上失败,出现以下错误:

代码语言:javascript
复制
INSUFFICIENT_ACCESS: {'info': u'00000005: SecErr: DSID-031A11D7, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0\n', 'desc': u'Insufficient access'}

我不知道这个问题是来自于我的python代码还是目录中我的用户的糟糕配置。此外,我不是AD服务器的管理员(而且对此一无所知)。

,我需要在我的用户上设置一些特殊的东西来允许他自我更新他的密码吗?我是否使用正确的方法更新密码?

注意:我也尝试过这个方法来更新密码,但没有成功:

代码语言:javascript
复制
l.passwd_s(dn.format(username), old_pwd, new_pwd)

因错误而失败:

代码语言:javascript
复制
PROTOCOL_ERROR({'info': u'0000203D: LdapErr: DSID-0C0911D4, comment: Unknown extended request OID, data 0, v3839', 'desc': u'Protocol error'},)

我到处读到这个函数不应该和AD服务器一起使用..。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2018-10-26 12:11:29

MS Active区分两种不同的用例。

注意:old_passwd_valuenew_passwd_value都必须是奇怪的、双引用的、低端的UTF-16编码,就像代码片段中的那样。

如果管理员设置了其他用户的密码,则可以使用您的代码:

mod_list = [ (ldap0.MOD_REPLACE, 'unicodePwd', [new_passwd_value]), ]

如果用户更改了自己的密码,您必须使用:

mod_list = [ (ldap0.MOD_DELETE, 'unicodePwd', [old_passwd_value]), (ldap0.MOD_ADD, 'unicodePwd', [new_passwd_value]), ]

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/937330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档