0

これは、ASP.NET の DirectoryServices を使用した基本的なパスワード変更方法であると想定されます。

コード:

String path = ConfigurationManager.AppSettings["LDAPServer"] + myDN;
DirectoryEntry de = new DirectoryEntry(path, @"Domain A\" + myUserId, myPassword, AuthenticationTypes.Secure);
de.Invoke("ChangePassword", new object[] { myPassword, myNewPassword});

仮想 IIS (Visual Studio を使用) を介してローカルで実行すると、これは正常に実行されます。ただし、これを本番環境に公開すると、次のようになります。

マシンが使用できないか、アクセスが拒否されたため、ドメイン コントローラから構成情報を読み取ることができませんでした。(HRESULT からの例外: 0x80070547)

唯一の違いは、私のコンピューターはドメイン A にあるが、公開されたサーバーはドメイン B にあることです。ドメイン A とドメイン B は信頼されており、ドメイン A はドメイン B の親です。

エラーがどこでどのように発生するのか、誰にも分かりますか?

編集:おそらく、これは Web サービスであることを追加する必要があります。別のアプリが検証に必要な情報をスローし、Web サービスがパスワードを変更します。

4

2 に答える 2

0

さて、上記のような問題を回避するために私がしたことは次のとおりです。

  1. 両方の AD を照会できるサービス アカウントを設定します

最初の方法

private bool ResetDomainAccountPassword(string loginName, string oldPassword, string newPassword)
{
  DirectoryEntry e2 = new DirectoryEntry();

  try
  {
    // ----- Get the credentials for the active directory service account.
    string userName = ServiceUser();
    string password = ServicePassword();

    using (DirectoryEntry e = new DirectoryEntry(Path(), userName, password, AuthenticationTypes.Secure))
    {
      string search = string.Format("(sAMAccountName={0})", loginName);

      DirectorySearcher s = new DirectorySearcher(e, search);

      SearchResult sr = s.FindOne();
      if (sr != null)
      {
        e2 = sr.GetDirectoryEntry();
        e2.Username = userName;
        e2.Password = password;
      }

      if (e2.NativeGuid != null)
      {
        return ResetPassword(e2, oldPassword, newPassword);
      }
      else
        return false;
    }
  }
  catch (Exception ex)
  {
    Exception inner = ex.InnerException;

    // ----- Handle exception here.

    return false;
  }
  finally
  {
    e2.Dispose();
  }
}

パスワードのリセット方法

private bool ResetPassword(DirectoryEntry e, string oldPassword, string newPassword)
{
  try
  {
    ActiveDs.IADsUser u = e.NativeObject as ActiveDs.IADsUser;
    Type t = e.NativeObject.GetType();
    if (u.IsAccountLocked)
    {
      u.IsAccountLocked = false;
      u.SetInfo();
    }

    u.SetPassword(newPassword);
    u.SetInfo();

    e.CommitChanges();


    return true;
  }
  catch (Exception ex)
  {
    Exception inner = ex.InnerException;

    // ----- Handle exception here.

    return false;
  }
}

忘れていたことが 1 つあります。「Active DS Type Library」(COM) への参照を追加する必要があります。

于 2011-10-27T08:51:32.667 に答える
0

あなたのものを回答としてマークして、それを取り除いて申し訳ありません。IDの問題で実際に別のエラーが発生していたので、この問題は解決したと思い、次の問題に進みました。

とにかく、DirectoryEntryのPATHを変更することで解決しました。以前は:

LDAP://server.domain/識別名

しかし、私はそれを

LDAP://識別名

その後、すべて正常に機能していました。

于 2011-11-01T03:42:23.090 に答える