前提

安装依赖包

pip install ldap3

1 建立连接

from ldap3 import Connection, Server, SAFE_SYNC, MODIFY_REPLACE


LDAP_ADDRESS = '192.168.1.2'
LDAP_DOMAIN = 'lovelink.inc'
LDAP_WHO = 'Administrator'
LDAP_CRED = 'password_str'

conn = Connection(
    server=Server(
        LDAP_ADDRESS, 
        use_ssl=True, 
        connect_timeout=2,
        port=636	# 注意端口号
    ),
    user=f'{LDAP_WHO}@{LDAP_DOMAIN}',
    password=LDAP_CRED,
    client_strategy=SAFE_SYNC
)
print(conn.bind())		# 输出为`True` 测试连接成功
conn.unbind()

2 设置密码

new_pwd = ''	# 新密码

conn.bind()
status, result, response, request = conn.modify(
    # 此DN为例子,请以你的实际情况为准
    dn='CN=zhangsan1,OU=二级组织单位,OU=测试组织单位,DC=lovelink,DC=inc',
    changes={
        # 由于`unicodePwd`字段不可读
        # 故使用`userPassword`作为明文存储用户密码的字段
        # 如果密码另存数据库等其他保存方式,`userPassword`可不写
        'userPassword': [(MODIFY_REPLACE, [new_pwd])],
        'unicodePwd': [(MODIFY_REPLACE, [f'"{new_pwd}"'.encode('utf-16-le')])],
        # 66080 表示用户不可更改密码
        'userAccountControl': [(MODIFY_REPLACE, [66080])]
    }
)
print(status)
print(result)
print(response)
print(request)
conn.unbind()

3 说明 🔥

3.1 unicodePwd

  1. utf-16-le 字符集编码
  2. 字符外层需要使用"包裹,否则响应结果会unwillingtoperform

3.2 userAccountControl

  1. 对应数值 可参考官方文档:UserAccountControl 属性

3.3 unwillingtoperform 53 问题排查

  1. 密码复杂度是否合规
  2. unicodePwd是否使用"包裹

如有更多问题,欢迎在评论区留言

ENDING~