2

私はこれに数日間困惑しています。さまざまな解決策を試しましたが、役に立ちませんでした。助けてください...

問題: 私たちの管理下にない 2 つのドメイン コントローラーがあります。ポート 389 で LDAP 経由で接続できますが、ポート 636 では安全に接続できません。

私たちは、多くのセルフサービス機能を許可するシステムを開発しています。そのうちの 1 つがパスワード回復ツールです。これは、ユーザーのパスワードをリセットするまで機能します。

PHPマニュアルを介して、必要なことを実行しているように見えるコードをいくつか見つけましたが、それを機能させることはできません。

これは私がこれまで持っているコードです

if ($caller==="change"){
if (($newPword1 === NULL)||($newPword1 === "" )){ return false;}
if (($newPword2 === NULL)||($newPword2 === "" )){ return false;}
if ($newPword1 != $newPword2) {
  $result["ERROR"]="1";
  $result["DETAILS"]="Your new password and the confirmation must match!";
  exit();
}
try { 
    $adldap = new adLDAP(); 
} catch (adLDAPException $e) {
    $result["ERROR"]="1";
    $result["DETAILS"]="An error occurred in adLDAP";
    echo json_encode($result);
    exit();
}

$userinfo = $adldap->user()->info($username, array("givenname","dn","lockouttime"));
$res = $userinfo[0]["lockouttime"];
$userDN = $userinfo[0]["dn"];
$firstName = $userinfo[0]["givenname"];
$authUser = $adldap->authenticate($username,$currentPword);
if ($authUser){
    try {
        $adminUsername = $domain."\\".$adminUsername;
        $srvDN = "LDAP://".$server."/";

        try {
            $ADSI = new COM("LDAP:");
        } catch (exception $e){
            $result["ERROR"]="1";
            $result["ERRORmsg"]=$e->getMessage();
            echo json_encode($result);
            exit();
        }
        try {
            $user = $ADSI->OpenDSObject($srvDN.$userDN, $adminUsername, $adminPassword, 1);
        } catch (exception $e){
            $result["ERROR"]="2";
            $result["ERRORmsg"]= $e->getMessage();
            echo json_encode($result);
            exit();
        }
        try { //set password
            if ($user){
                $result["object"]="Success";
            } else {
                $result["object"]="Failed";
            }
            $user->SetPassword($newPword1);  //line:114 -> error occurring on this line
            $user->SetInfo();
            $result["ERROR"]="0";
            $result["DETAILS"]="Thank you $firstName[0]<br><strong>Your password has been changed</strong><br><br>This may take up to 30 minutes to take effect depending on your location";
        } catch (exception $e) {
            $result["ERROR"]="3";
            $result["ERRORmsg"]=$e." - ".$e->getMessage();
            $result["DETAILS"]="An Error Occurred.";
        }
        unset($user);
        unset($ADSI);
    } catch (exception $e){
        $result["ERROR"]="1";
        $result["DETAILS"]="An Error Occurred in the ADSI COM";
        echo json_encode($result);
        exit();
    }
} else {
    if ($res[0] != "0"){
        $result["ERROR"]="1";
        $result["DETAILS"]="Im sorry $firstName[0].<br>Your account is now locked.  Please contact the IT Service Desk for advice";
    } else {
        $result["ERROR"]="1";
        $result["DETAILS"]="Im sorry $firstName[0].<br>Your current password is incorrect";
    }
}

テストで$result["object"]は「成功」を返します。しかし、コードは$user->SetPassword($newPword1);行で失敗するようです。

返されるエラーは次のとおりです。

ERROR -> "3"
object -> "Success"
ERRORmsg -> "exception 'com_exception' with message '<b>Source:</b> Unknown<br/><b>Description:</b> Unknown' in C:\inetpub\wwwroot\<path>\<filename>.php:114
Stack trace:
#0 C:\inetpub\wwwroot\<path>\<filename>.php(114): variant->SetPassword('P@ssw0rd')
#1 {main} - <b>Source:</b> Unknown<br/><b>Description:</b> Unknown"
DETAILS -> "An Error Occurred."

上記のコードは、https を介してユーザーが表示可能なページによって呼び出される IIS Web サーバー上の php ドキュメントにあります。

アドバイスやガイダンスを提供できますか?

4

2 に答える 2

1

少なくとも Server 2k8R2 DC をターゲットにしている場合は、ほぼ同じことを行っており、動作するようになりました。

なぜあなたが失敗したのかはわかりませんが、役立つと思ったことがいくつかあります。

1) catch() ハンドラで SetPassword() から返されたエラーを取得し、次のように処理して表示します。

$rawErr = $e->getCode();
$processedErr = $rawErr + 0x100000000;
printf( 'Error code 0x%x', $processedErr );

次に、ここにリストされているかどうかを確認します。これも役立つかもしれません。

2) ChangePassword() への SetPassword() 呼び出しを変更してみてください。これには、古いパスワードも入力する必要がありますが、DC での特権要件はそれほど厳しくありません。それを機能させることができれば、SetPassword() の問題は、OpenDSObject() 呼び出しで認証するために使用している管理者アカウントがターゲット ドメインに対して十分な権限を持っていないことを示唆している可能性があります。

ただし、SetPassword() とは異なり、パスワード ポリシーが厳密に適用される ChangePassword() に関する注意事項があります。そのため、パスワードの最低使用期間や複雑さ、履歴などを考慮する必要があります。私はその最後のものに行き詰まりました。

頑張ってね、イアン。

于 2013-01-12T17:55:52.153 に答える