我一直在尝试用PHP创建Windows用户帐户,这本身就没有问题。我唯一不能做的是将Windows用户密码设置为公司标准密码。 我可以创建,更改和删除用户帐户,除了密码之外没有任何问题。每次我创建一个用户并尝试使用凭据登录时,我得到的是“用户名或密码错误”。我检查了用户名。
到目前为止我尝试了什么:
ldapp_add
,密码清晰($ldaprecord['userPassword'] = "standard";
)$ldaprecord['userPassword'] = '{MD5}' . base64_encode(pack('H*',md5($newuser_plaintext_password)));
就像php.net 似乎我可以更改$ldaprecord['userPassword']
,但当我尝试更改ldaprecord['unicodePwd']
时,服务器不愿意更改我的请求。
哪个是密码正确的?
我没有通过SSL连接到AD。这是我的错吗?如果是这样,为什么我可以删除用户但不设置密码?
提前致谢。
修改
要求系统管理员通过SSL建立连接,但他说轻量级目录服务甚至没有安装在DC上。在他看来,我直接在AD工作。有什么想法?
使用IIS在Windows 2012 R2上工作。
答案 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密码的文章。