【问题标题】:PHP & IIS: LDAPS Connection for Password ChangePHP & IIS:用于密码更改的 LDAPS 连接
【发布时间】:2013-02-18 05:14:34
【问题描述】:

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

我一直按照http://www.ashleyknowles.net/2011/07/iis-php-and-ldaps-with-active-directory/上的说明进行操作

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

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

<?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;
}

?>

【问题讨论】:

    标签: php iis active-directory ldap


    【解决方案1】:

    已解决!!

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

    密码编码成功的功劳归于hd42forum post,这使我能够相应地修改我的代码。

    因此,一旦您在 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));
        }
    
    }
    

    【讨论】:

    • 你先生,太棒了:)
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多