使用TCL ldap软件包更改用户AD密码

时间:2019-01-29 15:43:34

标签: tcl

挑战在于更改用户的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

有任何要调查的提示吗?

2 个答案:

答案 0 :(得分:0)

我无法对此进行测试(因为我没有可用的环境),但是请遵循此报价...

  

unicodePwd属性的语法为八位字节字符串;然而   目录服务期望八位字节字符串将包含UNICODE   字符串(如属性名称所示)。这意味着任何   在LDAP中传递的此属性的值必须是UNICODE字符串,该字符串应   被BER编码(基本编码规则)作为八位字节串。在   此外,UNICODE字符串必须以非引号引起来   所需密码的一部分。

来自https://support.microsoft.com/en-gb/help/269190/how-to-change-a-windows-active-directory-and-lds-user-password-through

... 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的方法