3

我的目标是通过使用 PHP 和 IIS 的 Web 界面更改 Active Directory 中的密码。

我一直在遵循http://www.ashleyknowles.net/2011/07/iis-php-and-ldaps-with-active-directory/上的说明

在遵循这些说明之前,我无法为 LDAPS 连接绑定到 AD,但是在遵循这些说明之后,它似乎成功连接,但是当我尝试更改“unicodePwd”时出现“服务器不愿意执行”错误“ 价值。

请注意,下面的代码将成功更改 AD 中用户的任何其他值。

<?php

$ldaprdn  = 'CN=Admin User,OU=*******,OU=Staff,OU=********,DC=********,DC=*******,DC=******,DC=*****';
$ldappass = "*******";  // associated password

$ldapconn = ldap_connect("ldaps://***.***.***.***:636" ) or die("Could not connect to LDAP server.");

ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);

if ($ldapconn) {

    // binding to ldap server
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

    // verify binding
    if ($ldapbind) {
        echo "LDAP bind successful...";

        $username = '******';

        $dn = "CN=Bob Smith,OU=******,OU=******,OU=******,DC=******,DC=******,DC=******,DC=******";

        $newPassword = 'blah';

        $newEntry = array('unicodePwd' => encodePwd($newPassword));

        print_r($newEntry);

        if(ldap_mod_replace($ldapconn, $dn, $newEntry)) {
            print "<p>succeded</p>";
        } else {
            print "<p>failed</p>";
        }

        print_r(ldap_error($ldapconn));

    } else {
        echo "LDAP bind failed...";
        print_r(ldap_error($ldapconn));
    }

}

// Credit: http://www.cs.bham.ac.uk/~smp/resources/ad-passwds/
function encodePwd($pw) {
    $newpw = '';
    $pw = "\"" . $pw . "\"";
    $len = strlen($pw);
    for ($i = 0; $i < $len; $i++)
        $newpw .= "{$pw{$i}}\000";
    $newpw = base64_encode($newpw);
    return $newpw;
}

?>
4

1 回答 1

4

解决了!!

事实证明,通过遵循Ashley Knowles 教程,我成功地通过 LDAP 建立了 SSL 连接,但是由于密码编码而发生错误。

成功密码编码的功劳归于这个论坛帖子上的hd42,这使我能够相应地修改我的代码。

因此,一旦您在 IIS 服务器的硬盘驱动器中正确安装了证书等,此代码将通过 IIS Web 服务器使用 PHP 成功修改 Active Directory 中的用户密码(假设 $ldaprdn 用户具有足够的管理员权限):

<?php

$ldaprdn  = 'CN=Admin User,OU=*******,OU=Staff,OU=********,DC=********,DC=*******,DC=******,DC=*****';
$ldappass = "*******";  // associated password

$ldapconn = ldap_connect("ldaps://***.***.***.***:636" ) or die("Could not connect to LDAP server.");

ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);

if ($ldapconn) {

    // binding to ldap server
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

    // verify binding
    if ($ldapbind) {
        echo "LDAP bind successful...";

        $dn = "CN=Bob Smith,OU=******,OU=******,OU=******,DC=******,DC=******,DC=******,DC=******";

        $newPassword = 'blah';

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

        $newEntry = array('unicodePwd' => $newPass);

        print_r($newEntry);

        if(ldap_mod_replace($ldapconn, $dn, $newEntry)) {
            print "<p>succeded</p>";
        } else {
            print "<p>failed</p>";
        }

        print_r(ldap_error($ldapconn));

    } else {
        echo "LDAP bind failed...";
        print_r(ldap_error($ldapconn));
    }

}
于 2013-02-18T22:25:09.273 回答