挑战在于更改用户的AD密码。 我有一个包装ldapmodify的TCL脚本来设置密码,该密码可以正常工作:
set unicodePwd [encodePw4ad $pw]
lappend text {dn: $dn}
lappend text {changetype: modify}
lappend text {replace: unicodePwd}
lappend text {unicodePwd:: $unicodePwd}
lappend text {-}
set fn /tmp/ldiff.[clock microseconds].ldif
write_file $fn [subst [join $text \n]]
.....
exec ldapmodify -H $host -D $binddn -x -w $bindpw -f $fn
将TCL 8.6与LDAP 1.9.2打包在一起,代码看起来像:
set unicodePwd [encodePw4ad $pw]
set handle [::ldap::secure_connect $host 636 0]
ldap::bind $handle $binddn $bindpw
#ldap::modify $handle $dn [list postalCode 123456]
ldap::modify $handle $dn [list unicodePwd $unicodePwd]
ldap::unbind $handle
ldap::disconnect $handle
这适用于“ postalCode”,但不适用于“ unicodePwd”。
LDAP error unwillingToPerform '': 0000001F: SvcErr: DSID-031A12D2, problem 5003 (WILL_NOT_PERFORM), data 0
有任何要调查的提示吗?
答案 0 :(得分:0)
我无法对此进行测试(因为我没有可用的环境),但是请遵循此报价...
unicodePwd属性的语法为八位字节字符串;然而 目录服务期望八位字节字符串将包含UNICODE 字符串(如属性名称所示)。这意味着任何 在LDAP中传递的此属性的值必须是UNICODE字符串,该字符串应 被BER编码(基本编码规则)作为八位字节串。在 此外,UNICODE字符串必须以非引号引起来 所需密码的一部分。
... unicodePwd记录条目的值必须在Tcl(> = 8.6)中格式化,如下所示:
set pwd "abc123"
set pwd [string cat \" $pwd \"]; # must begin/ end in quotes
set pwd [encoding convertto unicode $pwd]; # UNICODE (UTF-16LE) string
set unicodePwd [binary encode base64 $pwd]; # base64 encoded variant
注意:您可以观察到[encoding convertto unicode $pwd]
产生的字符串,每个字符使用2个字节(“ abc123”含引号为16个字节),如果您使用的是utf-8或其他格式,则仅显示8个字符在不同的步骤运行[string length]
。
答案 1 :(得分:0)
问题找到:
的ldapmodify用途 'unicodePwd ::'。 “ ::”告诉AD,该值是base64编码的。
在TCL ldap :: modify中,“ unicodePwd”只能以unicode发送(无base64)。
我们确实找到了一种通过TCL ldap :: modify发送base64的方法