通过ldapmodify修改Active Directory密码

时间:2014-01-23 18:43:32

标签: active-directory ldap ldif

我正在调查各种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时,我仍然对如何正确地转义密码值感到困惑。是否有其他方法我不考虑?

1 个答案:

答案 0 :(得分:4)

为什么不使用ldifde和unicode base64编码密码,如下所述:http://support.microsoft.com/kb/263991

您的python脚本似乎将密码编码为unicode / base64。也许您的密码需要在您的ldif文件中编码(编码时使用引号)而不是您在示例中所做的纯文本。

例如:

unicodePwd:: IgBBAG4ARQB4AGEAbQBwAGwAZQBQAGEAcwBzAHcAbwByAGQAMQAhACIA

您提供的示例密码。