为新LDAP用户设置密码

时间:2016-02-26 17:54:37

标签: php passwords ldap

我一直在尝试用PHP创建Windows用户帐户,这本身就没有问题。我唯一不能做的是将Windows用户密码设置为公司标准密码。 我可以创建,更改和删除用户帐户,除了密码之外没有任何问题。每次我创建一个用户并尝试使用凭据登录时,我得到的是“用户名或密码错误”。我检查了用户名。

到目前为止我尝试了什么:

  • ldapp_add,密码清晰($ldaprecord['userPassword'] = "standard";
  • $ldaprecord['userPassword'] = '{MD5}' . base64_encode(pack('H*',md5($newuser_plaintext_password)));就像php.net
  • 中的给定示例一样
  • 尝试在添加用户后更改密码,请参阅this

似乎我可以更改$ldaprecord['userPassword'],但当我尝试更改ldaprecord['unicodePwd']时,服务器不愿意更改我的请求。 哪个是密码正确的?

我没有通过SSL连接到AD。这是我的错吗?如果是这样,为什么我可以删除用户但不设置密码?

提前致谢。

修改

要求系统管理员通过SSL建立连接,但他说轻量级目录服务甚至没有安装在DC上。在他看来,我直接在AD工作。有什么想法?

使用IIS在Windows 2012 R2上工作。

2 个答案:

答案 0 :(得分:4)

首先我做了@ChadSikorra告诉我:我创建了文件夹/文件C:\OpenLDAP\sysconf\ldap.conf并添加了行TLS_REQCERT never。但是这对ldap_start_tls()没有帮助,但是我们的系统管理员检查了DC,发现没有安装域控制器证书。所以我最终可以通过ldap_connect("ldaps://mydomaincontroller");建立连接,这意味着我可以设置unicodePwd - 属性。

下一个问题是unicodePwd的编码。这是要走的路:

$newPassword = "mypassword";
$newPassword = "\"" . $newPassword . "\"";
$newPass = mb_convert_encoding($newPassword, "UTF-16LE");

奇怪的是,在将用户添加到AD时似乎无法设置密码(如果有办法,请更正我)。相反,您必须在之后设置密码:

$result = ldap_add(...);
$entry = array(
    "unicodePwd" => "$newPass",
    "pwdLastSet" => 0
);
ldap_modify($connect, $member, $entry);

使用ldap_add()设置密码对我不起作用。 pwdLastSet强制用户在登录后更改密码,$member是用户的“ID”(例如:CN=johndoe, ou=person, dc=mycompany)。确保 在“CN =”之后使用唯一键。

谢谢你们的帮助。

答案 1 :(得分:0)

根据this Microsoft article,看起来密码存储在 unicodePwd 字段中,只能设置但不能读取。除此之外,NTLM-Hash和NT-Hash可以存储在SAM数据库(AFAIK无法通过LDAP访问)中,因此您无法通过LDAP更改密码。

有一篇关于如何通过上述网站上引用的LDAP更改Windows200密码的文章。