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 に答える