通过ldapmodify在AD中更改密码时的LDAP约束违规

问题描述:

我目前尝试通过Linux在LDAP上更改我们的Active Directory Envoirenment中的密码,因为有问题的用户无法访问Windows计算机,我们希望保持这种方式。 为了更改密码,我目前不知道如何使用ldapmodify来做到这一点。大量的阅读不同网站/论坛/新闻组后,我比以前通过ldapmodify在AD中更改密码时的LDAP约束违规

但是更加困惑: 我尝试使用以下命令这样做:

ldapmodify -f ldif.example -H ldaps://lab01-dc01.example.com -D 'CN=test,CN=users,DC=lab01,DC=example,DC=com' -x -W 

的ldif.example的内容:

dn: CN=test,CN=Users,DC=lab01,DC=example,DC=com 
changetype: modify 
delete: unicodePwd 
unicodePwd:: V3VQdXV1STEyLg== 
- 
add: unicodePwd 
unicodePwd:: QmxhVVVraTEyLg== 
- 

(不要担心 - 这些密码不会被任何地方使用,它不是一个生产envoirenment)

现在 - 每次我执行我收到以下错误的命令:

modifying entry CN=test,CN=Users,DC=lab01,DC=example,DC=com" 
ldapmodify: Constraint violation (19) 
additional info: 0000216C: AtrErr: DSID-03190EB0, #1: 
0: 0000216C: DSID-03190EB0, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 9005a (unicodePwd) 

现在,经过我读此错误的原因是要么密码格式错误或密码策略不允许我使用的密码。我检查了这个政策 - 现在多次 - 新密码通过所有标准定义符合政策。如果我使用Windows机器设置密码,它也可以很好地工作(当然,之后我更改了“oldpassword”和“newpassword”,因为策略不允许我更改为较早的密码)。在将“-W”选项传递给ldapmodify后输入的密码也是正确的,否则ldapmodify吐出的错误是我使用无效凭证而不是违反约束条件。 所以 - 我能想到的唯一原因实际上是格式不正确的密码 - 但我无法弄清楚格式不好应该来自哪里,因为我使用普通的base64 algorythm来编码密码。

有没有人知道发生了什么事? 任何人都可以把我推向正确的方向吗?

帮助非常感谢,我提前感谢您。

编辑: 误会我的东西: 当我通过base64运行基本编码的字符串时,它一直告诉我“无效输入”。现在 - 我继续前进,只是在linux机器上使用base64重新编码密码 - 但是当我再次通过解码函数运行生成的字符串时,base64一直告诉我“Invalid Input”无效在windows-base64编码的字符串和linux编码的字符串之间改变。但base64只是说“输入无效”,不管我放在那里。

编辑2: Nevermind - 阅读函数的目的我收集它会抛出此错误,因为密码中的圆点和感叹号。

+0

我不确定你应该做任何编码。 LDAP服务器应该这样做。尝试以纯文本提供这两个密码。 – EJP 2012-04-04 01:39:57

+0

是的,确实如果没有编码密码它似乎工作正常。就像我说的:我读了很多关于这个主题的内容,并且我读到的所有内容都表明我需要使用编码的字符串来修改密码。显然 - 这不是真的。谢谢! – henryford 2012-04-04 07:58:47

设置密码时,需要使用UTF-16LE和Base64编码。在Java中,它可以用做:

String source = "\"car\""; 
String utf16base64 = new String(Base64.getEncoder().encode(source.getBytes("UTF-16LE"))); 

UTF-16 LE已被使用,UTF-16是不够的。

通过LDAP更改'unicodePwd'要求新密码是带双引号的Unicode字符串。这意味着当你想要设置一个新密码(Password01!)时,用双引号(“Password01!”)将密码转换为Base64。

可以使用在线工具 - http://www5.rptea.com/base64/(选择UTF-16)。

关于unicodePwd的详情有 - https://technet.microsoft.com/en-us/magazine/ff848710.aspx

如何从其他用户获取正在存在的工作密码并尝试将其包含在您的ldif中?

这样你就可以确定你的密码正在工作。

二,不要在ldif中使用delete/add使用replace。也许删除会导致objectclass违规错误。

第三,如果只包含不可打印或特殊字符的属性,则只需对base64进行编码。在ldif文件的末尾有一个空行。

dn: CN=test,CN=Users,DC=lab01,DC=example,DC=com 
changetype: modify 
replace: unicodePwd 
unicodePwd: BlaUUki12. 

问候,

+0

感谢您的回答 - 替换确实工作正常,但问题是我必须使用管理绑定才能使用替换功能。但是,这可能是好的,我只会创建另一个帐户。因为我在技术上用smbpasswd而不是LDAP来解决它,所以我不再需要它了 - 但是我现在正在挖掘LDAP,所以我会这样做。再次感谢! – henryford 2012-04-04 07:56:17

+1

这是一个老问题,但替换只适用于管理员而不是用户 – Kevin 2012-05-24 14:29:58

+0

如上所述,替换不适用于用户替换自己的密码。这不应该被接受的答案。 – 2015-03-06 23:39:49

以供将来参考,如果有人遇到similiar问题: 简单的解决方案?只需使用smbpasswd而不是ldap来更改密码 - 完美无瑕!我真的grumped,我没想到之前的它: - d

但是使用(使用CentOS的)桑巴舞在Active Directory中更改密码的方式:

~#yum install samba 
~#smbpasswd -r domaincontroller.example.com -U testuser1 
Old SMB password: 
New SMB password: 
Retype new SMB password: 
Password changed for user testuser1 on domaincontroller.example.com 

然后你就可以登录使用新密码。这很简单,真的。

yum install samba对我不起作用,因为它从samba 3.6.9版本安装了smbpasswd程序。

工作原理是yum install samba4-client。这会为Samba 4安装smbpasswd程序,并且此版本的smbpasswd actualy可以在Windows Server 2008 R2域控制器上更改密码。我使用samba4-client,因为我不需要Samba服务器,只需要客户端实用程序。

为smbpasswd命令的语法是一样的:

smbpasswd -r domaincontroller.example.com -U testuser1  

希望这有助于。

约束错误可能意味着您使用的旧密码不符合策略,例如不能使用最后的24个密码。 对于将来的参考: 连接到AD服务器(绑定): 1.作为管理员:你可以更改和重置每个人的密码。更改和重置之间有区别。更改= AD将执行密码策略。重置=不。 2.作为用户:您可以更改密码,但不允许重置密码。更改= AD将执行密码策略。 希望它有帮助,虽然有点晚!