0

次のコードを使用して、Active Directory のユーザー パスワードを設定しようとしていました。

using (var context = new PrincipalContext( ContextType.Domain ))
{
  using (var user = UserPrincipal.FindByIdentity( context, IdentityType.SamAccountName, userName ))
  {
      user.SetPassword( "newpassword" );
      user.ExpirePasswordNow();
  }
}

コードは問題なくユーザー情報を取得しましたが、パスワードをリセットしようとすると、アクセスが拒否されました。その後、上記のコードでは操作を実行するためのセキュリティ コンテキストが提供されていないことに気付きました。それを入れる方法は?MSDN は、PrincipalContext の完全なコンストラクターを次のように提供します。

public PrincipalContext(
   ContextType contextType,
   string name,
   string container,
   string userName,
   string password
)

私が見つけたすべての例から、最初の文字列がサーバー名であり、ユーザー名とパスワードも十分に明確であることが明らかになりましたが、「コンテナ」とは何でしたか. MSDN の説明は、泥のように明確でした。

「コンテキストのルートとして使用するストアのコンテナー。すべてのクエリはこのルートの下で実行され、すべての挿入はこのコンテナーに対して実行されます。」

「ABCD」のような任意の文字列を使用してみましたが、うまくいきませんでした。いろいろ試してみましたが、良い結果にはなりませんでした。

これを修正する方法は?

4

1 に答える 1

3

最後に、このStackOverflowの質問で答えを掘り下げました:

Active Directory サービス: PrincipalContext -- 「コンテナ」オブジェクトの DN とは?

モノをnullのままにします。うわー、なんてコンセプト。私はそれを試してみましたが、驚いたことに、実際に機能しました。これが私の最終的な作業コードです:

using (var context = new PrincipalContext(ContextType.Domain, "xxxdcoly302.xxx.xx.lcl", null, @"XXX\admin-acct", "Beautifu!"))
{
    using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userAccountID))
    {
        user.SetPassword("Pa$$word1");
        user.ExpirePasswordNow();
    }
}

最初に、上記のサーバー名の一部として「LDAP://」を含めようとしたことに注意してください (「xxxdcoly302.xxx.xx.lcl」)。これはうまくいきませんでした!「サーバーに接続できませんでした」と表示されました。そのLDAPプレフィックスをオフのままにしておくという別のStackOverflowの回答が見つかりました。だから私はそうしました、そしてそれはうまくいきました。

于 2012-12-21T20:26:20.790 に答える