【问题标题】:set password for new LDAP user为新的 LDAP 用户设置密码
【发布时间】:2016-02-26 17:54:37
【问题描述】:

我一直在尝试用 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 上工作。

【问题讨论】:

  • 这是 Active Directory 而不是 OpenLDAP,对吗?无论如何,我看到您提到了创建 Windows 用户帐户。如果是这样,是的,需要通过 SSL/TLS 进行加密连接才能更改密码(除非您已将 AD 修改为不需要它,否则不建议这样做)。此外,通常(再次假设这是 AD...)您将使用 unicodePwd 属性而不是 userPassworduserPassword 属性在没有修改的情况下默认不起作用。
  • 是的,它是一个 Active Directory。我将尝试通过 SSL 建立 LDAP 连接。困扰我的是,没有 SSL 我无法更改或设置密码,但我可以删除用户。
  • 是的,只要您使用密码属性,它就需要 TLS 或 SSL。如果您正在使用 AD,您很可能应该使用ldap_start_tls($connection) 进行加密。在ldap_connect() 调用之后直接使用该函数,否则它将不起作用。
  • @ChadSikorra 试过了。 “无法启动 TLS:连接错误”。我该怎么做才能让它运行?在php.net 上找到了一些条目,但它们对我不起作用。在此处使用 IIS 运行 Windows 2012。
  • 可能是证书问题 这是 PHP 中 LDAP 和 TLS 的常见问题。对于测试(在运行 PHP 的服务器上)创建文件(和文件夹,如果需要)C:\OpenLDAP\sysconf\ldap.conf。然后在该文件中添加行TLS_REQCERT never。这基本上告诉它不要验证来自 LDAP 的证书而只是接受它。我不记得在这样做之后是否需要重新启动 IIS。

标签: php passwords ldap


【解决方案1】:

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

下一个问题是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=”之后使用唯一键。

谢谢大家的帮助。

【讨论】:

【解决方案2】:

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

上面提到的网站上有一篇关于如何通过 LDAP 更改 Windows200 密码的文章。

【讨论】:

  • 虽然这几乎总是如此,但应该注意的是,可以使用 AD 中的 RFC 标准 userPassword 属性设置密码。但是,您确实需要不遗余力地启用它。一些附加信息:msdn.microsoft.com/en-us/library/cc223249.aspx
  • Ooi:你指的是哪个 RFC?
  • RFC 4519,它描述了一个标准的 LDAP 模式。我认为那是最新的 RFC 吗?与 LDAP 相关的 RFC 并不完全是用于阅读的翻页器(:
  • RFC 指定了“广泛使用”属性的技术规范,但并不意味着必须使用这些属性。 (遗憾的是)由目录管理员来指定实际使用哪些属性:(
  • 没错,好点。我什至从未注意到关于密码如何存储在 RFC 4513 中的脚注:tools.ietf.org/html/rfc4513#appendix-B.2.5。每天学习新东西。
猜你喜欢
  • 1970-01-01
  • 2019-02-02
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多