我正在研究各种 LDAP 操作的脚本。但是,我在创建 Active Directory 用户时遇到了一些障碍。
当我通过ldapmodify
命令加载以下 LDIF 时,它会失败:
dn: CN=Frank,CN=Users,DC=domain,dc=local
changeType: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Frank
userPrincipalName: frank@domain.local
sAMAccountName: frank
givenName: Frank
sn: Stein
displayName: Frank Stein
description: Frankenstein's User
userAccountControl: 512
unicodePwd: "AnExamplePassword1!"
尝试通过 LDIF 添加用户时,我使用了以下命令:
ldapmodify -H 'ldaps://<ip-of-server>:636' -D 'DOMAIN\Administrator' -x -W -f frank-add.ldif
这失败并出现以下错误:
ldap_add: Server is unwilling to perform (53)
additional info: 0000001F: SvcErr: DSID-031A120C, problem 5003 (WILL_NOT_PERFORM), data 0
这是密码策略拒绝用户的问题。
但是,以下 Python 脚本有效:
#!/usr/bin/python
import ldap
import ldap.modlist as modlist
AD_LDAP_URL='ldaps://<ip-of-server>:636'
ADMIN_USER='DOMAIN\Administrator'
# User must be authorized to create accounts, naturally.
ADMIN_PASSWORD='password for ADMIN_USER'
BASE_DN='dc=domain,dc=local'
username='frank'
firstname='Frank'
surname='Stein'
displayName = "Frank Stein"
password='AnExamplePassword1!'
# The value of password still needs to adhere to the domain's password policy.
unicode_pass = unicode('\"' + password + '\"', 'iso-8859-1')
password_value = unicode_pass.encode('utf-16-le')
l = ldap.initialize(AD_LDAP_URL)
l.simple_bind_s(ADMIN_USER, ADMIN_PASSWORD)
dn=str('CN=%s,CN=Users,DC=domain,dc=local' % firstname)
attrs = {}
attrs['objectclass'] = ['top','person','organizationalPerson','user']
attrs['cn'] = str(username)
attrs['sAMAccountname'] = str(username)
attrs['unicodePwd'] = str(password_value)
attrs['givenName'] = str(firstname)
attrs['sn'] = str(surname)
attrs['displayName'] = str(displayName)
attrs['description'] = str("Frankenstein's User")
attrs['userPrincipalName'] = str("%s@domain.local" % username)
attrs['userAccountControl'] = str(512)
ldif = modlist.addModlist(attrs)
l.add_s(dn,ldif)
使用 Python 脚本,我可以立即使用用户密码(减去转义的引号)登录。我仍然可以通过选择太简单的密码(例如“密码”)来触发相同的“不愿意执行”错误。但是,在这种情况下,使用的密码是相同的。
据我所知,操作应该是相同的。破坏 LDIF 文件的不同之处在于我处理包含密码所需的引号的方式。如果我通过将 userAccountControl 的值设置为 544 并且不包括密码来创建禁用帐户,则通过 LDIF 创建成功。但是,这意味着我需要手动去重置用户的密码。
到目前为止,我已经通过 LDIF 尝试了以下密码格式:
- 没有引号。
- 简单的引号。
- 通过 \ 转义引号
- 通过 ASCII 转义引号:{\22}
- 使用 Python 对密码进行 Base64 编码(带引号和不带引号,并将 LDIF 的格式修改为
unicodePwd::
)
虽然我很高兴我有一种通过 Python 添加用户的工作方法,但我仍然对在使用 LDIF 文件和ldapmodify
. 有没有我不考虑的替代方法?