0

我似乎遇到了在 AD 中重置密码的经典错误,尽管我在网上找到的所有内容都普遍指向我应该是黄金的事实。

先上代码。

from ldap3 import *

username = '<account with the proper permissions>'
password = '<totally@realpassword>'

server = Server('<fqdn of server>', use_ssl=True, get_info=ALL)
conn = Connection(server, user='<domain>\\' + username, password=password, authentication=NTLM, auto_bind=True)

print(conn)

user_dn = 'CN=Test,OU=US,OU=NA,OU=Employees,OU=Users,DC=domain,DC=com'
new_pass = 'U^mod2olla'

r = conn.extend.microsoft.modify_password(user_dn, new_pass)

print(conn.result)

这似乎是通过 SSL 实例化与我的 LDAP 服务器的连接的正确方法,此连接打印输出证实了这一点:

ldaps://ldap.domain.com:636 - ssl - user: domain.com\samaccountname - not lazy - bound - open - <local: IP:62368 - remote: IP:636> - tls not started - listening - SyncStrategy - internal decoder

但我仍然收到此错误:

{'result': 53, 'description': 'unwillingToPerform', 'dn': '', 'message': '0000001F: SvcErr: DSID-031A1248, problem 5003 (WILL_NOT_PERFORM), data 0\n\x00', 'referrals': None, 'type': 'modifyResponse'}

根据我的谷歌搜索,这通常意味着密码没有正确编码,或者连接根据 LDAP 服务器不够安全。

我在这一点上迷路了。想法?

@cannatag 如果你在外面……我需要你 :)

我的研究链接:

https://github.com/cannatag/ldap3/issues/130

Python 3.5、ldap3 和 modify_password()

无法通过 ldap3 Python3 更改用户密码

在 Python 3.x 中更改 Active Directory 用户密码

4

2 回答 2

0

不幸的是,我的假设是正确的,即不存在与代码相关的问题。

我与我们的一些域管理员聊天,他们向我确认我使用 LDAPS 连接的服务器实际上是 F5 并且 LDAPS 在那里终止。这意味着如果没有特定的证书和 IP,就不可能建立到任何单个域控制器的 LDAPS 连接。这样做对我的系统来说是不可扩展或不现实的,所以我不会使用这种方法来重置 AD 中的密码。

如果有人发现自己处于类似情况,我建议从 Linux 研究 PowerShell 远程处理。现在可以在 Linux 上运行本机 powershell 并在 Windows Server 上打开会话以在本地执行命令。目前您需要 PS 6.0 测试版。

于 2017-08-25T18:23:14.807 回答
0

您需要以域管理员身份绑定到 AD。

之后搜索 userdn 并修改

我正在使用 c.modify(user_dn,{"userAccountControl":(MODIFY_REPLACE,512)}) 来确保用户可以登录(如果锁定或密码过期,我们将无法更改密码)

admin = CONF['admin']['user']
passwdadm = CONF['admin']['pass']
with connect_ldap(authentication=SIMPLE, user=admin, password=passwdadm) as c:
    c.bind()
    user_dn = find_user_dn(c, username)
    c.modify(user_dn,{"userAccountControl":(MODIFY_REPLACE,512)})
    print(c.result)
    c.unbind()

with connect_ldap(authentication=SIMPLE, user=admin, password=passwdadm) as c:
    c.bind()
    user_dn = find_user_dn(c, username)
    c.extend.microsoft.modify_password(user_dn, new_pass, old_pass)
    print(c.result)
    c.unbind()
于 2017-08-25T07:44:38.507 回答