4

Active Directoryとは別のサーバーにWebアプリケーションがあり、ユーザーパスワードを変更したい。コードは次のとおりです。

string newPassword = Membership.GeneratePassword(int.Parse(WebConfigurationManager.AppSettings["passLenght"]),
                                int.Parse(WebConfigurationManager.AppSettings["passNonAlpha"]));

DirectoryEntry de = new DirectoryEntry(WebConfigurationManager.ConnectionStrings["ADConnString"].ConnectionString,
WebConfigurationManager.AppSettings["ADAdmin"], WebConfigurationManager.AppSettings["ADAdminPass"]);

DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(objectClass=user) (userPrincipalName=" + name + "))";

SearchResultCollection results = deSearch.FindAll();

if (results.Count == 1)
{
   foreach (SearchResult OneSearchResult in results)
   {
      DirectoryEntry AlterUser = OneSearchResult.GetDirectoryEntry();
      AlterUser.AuthenticationType = AuthenticationTypes.Secure;
      AlterUser.Invoke("SetPassword", newPassword);
      AlterUser.CommitChanges();
      AlterUser.Close();
   }
}

これを開発環境(Active DirectoryとWebアプリケーションが同じサーバー上にある)で実行すると、機能します。しかし、本番環境で実行しようとすると、次のエラーが発生します。

呼び出しのターゲットによって例外がスローされました

私は何が欠けていますか?

ありがとう。

編集:

例外エラーを深く掘り下げることができ、次のようになります。

アクセスが拒否されました。(HRESULTからの例外:0x80070005(E_ACCESSDENIED))

4

3 に答える 3

9

権限が問題です。ASP.NETコードが実行されているアカウントには、アカウントのパスワードを設定する権限がありません。

また:

  • 必要な権限を持つユーザーの下でAppPoolを実行する、または
  • なりすましを使用して、SetPassword通話の権限を引き上げます

開発環境で機能している/本番環境で失敗している理由は、次の組み合わせが原因である可能性があります。

  • 必要なアクセス許可を持つユーザーアカウントで実行されるVisualStudio開発Webサーバーでアプリを実行しています。「実際の」IISで実行すると、特権の低いアカウントで実行されます。
  • ライブ環境では、WebサーバーからADサーバーへの別のマシンホップがあり、資格情報は渡されません。LogonUserWebサーバーは、ADに対して認証するために、ネットワーククレデンシャル(AppPool IDの一部として、またはへの呼び出しとして)を持っている必要があります。
于 2011-10-31T09:23:20.760 に答える
1

コードは正しいようです。これは、ActiveDirectoryを介して送信するパスワードが最小要件を満たしていないために発生している可能性があります。「M2k3ThisWork!」などのより複雑なパスワードを使用してみてください。

于 2012-05-08T20:41:06.310 に答える
0

ADのパスワードを変更したい場合は、これを使用します

AlterUser.Invoke("ChangePassword", OldPassword, newPassword);
于 2016-10-04T07:25:18.193 に答える