7

経由で Active Directory からグループを取得する際に問題が発生していますSystem.DirectoryServices

当初、ドメインに登録されたコンピューターでアプリケーションを開始しましたが、これはライブ ドメインであり、AD への書き込みを一切行いたくなかったため、ホスト オペレーティング システムとして Windows XP を搭載したマシンをセットアップしました。 、および VM に Windows Server 2003 をインストールしました。

マシンに別のイーサネット ポートを追加し、スイッチをセットアップしました。1 つのイーサネット ポートは VM 専用で、もう 1 つのポートはホストに使用されます。

通信できるように IP アドレスを構成した後、アプリケーションをホスト マシンに転送して起動しましたが、DirectoryServicesCOMException.

ユーザー名とパスワードが無効であるというメッセージが表示されました:(アクティブディレクトリではないことを確認するためだけに、3番目の仮想マシンを作成し、Windows XPをインストールしました.APPでテストされた資格情報を使用してドメインに追加しました。 .

そのため、アプリケーションが実行されているマシンがドメインの一部ではないためだと思いました。

問題の原因となったコード ブロックは次のとおりです。

public CredentialValidation(String Domain, String Username, String Password, Boolean Secure)
{
     //Validate the Domain!
     try
     {
         PrincipalContext Context = new PrincipalContext(ContextType.Domain, Domain); //Throws Exception
         _IsValidDomain = true;

         //Test the user login
         _IsValidLogin = Context.ValidateCredentials(Username, Password);

         //Check the Group Admin is within this user
         //******HERE
         var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context);

         foreach(Principal Result in Results)
         {
             if (Result.SamAccountName == "Domain Admins")
             {
                 _IsAdminGroup = true;
                 break;
             }
         }
         Results.Dispose();
         Context.Dispose();
     }
     catch (PrincipalServerDownException)
     {
         _IsValidDomain = false;
     }
 }

ログイン ダイアログの情報は次のように入力されます。

Domain: test.internal
Username: testaccount
Password: Password01

誰かがこのエラーに光を当ててくれることを願っています。


アップデート:

サーバーのセキュリティ ログを確認すると、ログイン試行が成功したことがわかりますが、これは次のことが原因です。

_IsValidLogin = Context.ValidateCredentials(Username, Password);

グループをチェックしている行の後の行がエラーを引き起こしているため、主な問題は、ネットワークに参加していないマシンから以下のコード行が正しく機能しないことです

var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context);
4

2 に答える 2

2

以前は、C# .NET を介してかなりの量のユーザー管理を行っていました。私はあなたが試すことができるいくつかの方法を掘り下げました.

次の 2 つのメソッドは、指定された SAM アカウント名の DirectoryEntry オブジェクトを取得します。アカウントの検索を開始する OU のルートである DirectoryEntry を使用します。

もう 1 つは、ユーザーがメンバーであるグループの識別名のリストを提供します。これらの DN を使用して AD を検索し、DirectoryEntry オブジェクトを取得できます。

public List<string> GetMemberOf(DirectoryEntry de)
{
  List<string> memberof = new List<string>();

  foreach (object oMember in de.Properties["memberOf"])
  {
    memberof.Add(oMember.ToString());
  }

  return memberof;
}

public DirectoryEntry GetObjectBySAM(string sam, DirectoryEntry root)
{
  using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))
  {
    SearchResult sr = searcher.FindOne();

    if (!(sr == null)) return sr.GetDirectoryEntry();
    else
      return null;
  }
}
于 2010-11-30T16:13:40.397 に答える
2

コード スニペットによると、ValidateCredentials を呼び出す前に PrincipalContext を作成しようとすると失敗します。その時点で、コードを実行しているスレッドは、ローカル ID (Web プロセスの場合) またはマシンにサインオンした ID (Windows プロセスの場合) のいずれかの下でまだ動作しています。これらのいずれも、test.internal ドメインには存在しません。

コンストラクターにユーザー名とパスワードを含む PrincipalContext のオーバーロードを試してみてください。http://msdn.microsoft.com/en-us/library/bb341016.aspxを参照してください。

于 2010-11-30T16:08:13.377 に答える