Active directory 通过ldapmodify在AD中更改密码时违反LDAP约束

Active directory 通过ldapmodify在AD中更改密码时违反LDAP约束,active-directory,ldap,openldap,adldap,Active Directory,Ldap,Openldap,Adldap,我目前试图在Linux上通过LDAP更改Active Directory环境中的密码,因为有问题的用户没有访问windows计算机的权限,我们希望保持这种方式。 为了更改密码,我目前正在琢磨如何使用ldapmodify来更改密码。在不同的网站/论坛/新闻组上读了很多之后,我比以前更困惑了 然而: 我尝试使用以下命令执行此操作: ldapmodify -f ldif.example -H ldaps://lab01-dc01.example.com -D 'CN=test,CN=users,DC=

我目前试图在Linux上通过LDAP更改Active Directory环境中的密码,因为有问题的用户没有访问windows计算机的权限,我们希望保持这种方式。 为了更改密码,我目前正在琢磨如何使用ldapmodify来更改密码。在不同的网站/论坛/新闻组上读了很多之后,我比以前更困惑了

然而: 我尝试使用以下命令执行此操作:

ldapmodify -f ldif.example -H ldaps://lab01-dc01.example.com -D 'CN=test,CN=users,DC=lab01,DC=example,DC=com' -x -W
ldif的内容。例如:

dn: CN=test,CN=Users,DC=lab01,DC=example,DC=com
changetype: modify
delete: unicodePwd
unicodePwd:: V3VQdXV1STEyLg==
-
add: unicodePwd
unicodePwd:: QmxhVVVraTEyLg==
-
(别担心-这些密码不会在任何地方使用,也不是生产环境)

现在-每次执行命令时,都会出现以下错误:

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算法对密码进行编码

有人知道发生了什么事吗? 有人能把我推向正确的方向吗

非常感谢您的帮助,我提前向您表示感谢

编辑: 有些事让我很烦: 当我通过base64运行base编码的字符串时,它总是告诉我“无效输入”。现在-我继续,只是在linux机器上使用base64重新编码密码-但是当我再次通过解码函数运行生成的字符串时,base64一直告诉我“无效输入”。。。但是,这些字符串在windows-base64编码字符串和linux编码字符串之间略有变化。但base64只会说“无效输入”,不管我在其中输入了什么

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

从其他用户获取现有的工作密码,并尝试将其包含在ldif中如何

通过这种方式,您将确保您的密码有效

其次,不要在ldif中使用“删除/添加”“使用替换”。删除可能会导致objectclass冲突错误

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

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

关于,

如果任何人遇到类似问题,请参考: 简单的解决方案?只需使用smbpasswd而不是ldap来更改密码-这是完美的!我真的很生气,因为我以前没有想到它

但是-使用samba(使用CentOS)在active directory中更改密码的方法:


然后您可以使用新密码登录。真的很简单。

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

有效的方法是
yum安装samba4客户端
。这将为Samba 4安装smbpasswd程序,此版本的smbpasswd实际上可以更改Windows Server 2008 R2域控制器上的密码。我使用samba4客户机,因为我不需要Samba服务器,只需要它的客户机实用程序

smbpasswd命令的语法相同:

smbpasswd -r domaincontroller.example.com -U testuser1    

希望这有帮助。

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

设置密码时,需要UTF-16LE和Base64编码。在Java中,可以通过以下方式完成:

String source = "\"car\"";
String utf16base64 = new String(Base64.getEncoder().encode(source.getBytes("UTF-16LE")));
必须使用UTF-16LE,UTF-16是不够的

在LDAP上更改“unicodePwd”需要新密码是带双引号的Unicode字符串。这意味着,当您要设置新密码(Password01!)时,请将带双引号的密码(“Password01!”)转换为Base64

可以使用在线工具-(选择UTF-16)


关于UnicodePd的详细信息在这里-。

我不确定您是否应该进行任何编码。LDAP服务器应该这样做。尝试以纯文本形式提供这两个密码。是的,的确如此-不编码密码似乎可以正常工作。就像我说的:我读了很多关于这个主题的文章,所有的文章都建议我必须使用一个编码字符串来修改密码。显然,这并不完全正确。谢谢谢谢你的回答-replace确实工作得很好,但问题是我必须使用admin绑定才能使用replace函数。但这可能没关系,我会创建另一个帐户。因为我用smbpasswd而不是LDAP解决了这个问题,所以从技术上讲我不再需要它了——但我还是会这样做,因为我目前正在深入研究LDAP。再次感谢!这是一个老问题,但“替换”仅适用于管理员而非用户。如图所示,“替换”不适用于用户替换自己的密码。这不应该是公认的答案。
String source = "\"car\"";
String utf16base64 = new String(Base64.getEncoder().encode(source.getBytes("UTF-16LE")));