ldap_mod_replace()[function.ldap-mod-replace]:修改:服务器不愿意执行

时间:2012-05-26 01:59:36

标签: php active-directory ldap windows-server-2008-r2

收到错误:

  

服务器不愿意执行

通过PHP更改AD中的unicodePwd。但是,我可以搜索,添加,删除和修改用户的任何属性。

使用管理员帐户绑定和管理员拥有更改任何用户密码的完全权限。

这是我正在使用的代码:

<?php
$dn = "CN=Vishal Makwana,OU=Address Book,DC=example,DC=com";
$ad = ldap_connect("ldap://example.com")
      or die("Couldn't connect to AD!");
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
$bd = ldap_bind($ad,"admin@example.com","admin1");

    if($bd) {
        echo "AD bind successfully";  
      }
    else {
        echo "Couldn't bind AD";;
    }

$user["unicodePwd"] = "asdf1234";

$result = ldap_mod_replace($ad, $dn, $user);
if ($result) echo "User modified!"; else
             echo "There was a problem!";

ldap_unbind($ad);
?>

2 个答案:

答案 0 :(得分:9)

要通过LDAP在AD中设置密码,您需要做很多事情。

  • 您需要使用SSL连接(ldaps://)

  • 密码需要用引号括起来

  • (引用)密码需要以16位unicode(UTF-16LE)编码

假设您尝试设置的密码是普通的ascii字符,则可以通过在ascii字符串的每个字节后添加\ 000字节来完成unicode转换,如this code sample所示。

所以你的例子看起来像:

$newpassword = "asdf1234";
$newpassword = "\"" . $newpassword . "\"";
$len = strlen($newpassword);
for ($i = 0; $i < $len; $i++) $newpass .= "{$newpassword{$i}}\000";
$user["unicodePwd"] = $newpass;

答案 1 :(得分:2)

经过大量搜索并花费大量时间后,我终于可以使用LDAP库从PHP代码修改活动目录用户密码。

我们需要LDAP与PHP代码中的活动目录服务器的连接;并且您必须修改unicodePwd字段。

ldap_connect(ldaps://IP, 636);
ldap_connect(ldaps://IP, 389);