我正在调查各种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://: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://: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
.有没有我不考虑的替代方法?