2011-01-13 24 views
7

私は私のアプリでタスクを実行する前に、私はADでユーザーのメンバーシップを確認するには、次のコードを使用しています状況があるWinフォームのユーザー認証

using System.Security.Principal; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
return principal.IsInRole("someGroup"); 

上記のコードは、自分のドメイン上のマシンのために正常に動作し、しかし、私は私のWINFORMアプリケーションがインストールされている私のドメインにないいくつかのマシンがあります。 ADのユーザーメンバーシップを確認するにはどうすればよいですか?

編集 - Windowsのログインを促す方法はありますか?

+0

あなたのwinformアプリケーションを実行しているユーザ(およびあなたのマシン)は、信頼できない別のドメインにいるのか、まったくドメインにいないのですか? Windowsログインの意味は?実際に自分のダイアログボックスを作成して、ユーザーにドメインユーザーとパスワードの入力を求めることができます。次に、ドメイン資格情報を使用してActive Directoryと通信します。 –

+0

修正してください。一部のマシンはドメイン上にありません。カスタムログインボックスを使用して資格情報を渡すことについての情報はどこにありますか?私は試しましたが、私は認証できますが、会員情報は取得できません。私はこれに続きましたhttp://support.microsoft.com/kb/326340 –

+1

私の提案された答えにコメントがありますか?それはあなたのために働くのですか? –

答えて

7

コンピュータがドメインにまったく参加していないため、WindowsIdentityまたはWindowsPrincipalを使用して、IsInRole()メソッドを確認することはできません。 IsInRole()メソッドは、コンピュータがドメインに参加し、ドメインマシンアカウントを使用してS4USelfを実行している場合にのみ機能します。

信頼されていないフォレストからログオンセッションを作成できないため、LogonUserのアプローチも使用できません。

Active Directoryに直接問い合わせるだけで、必要な情報を取得できると思います。投稿されたMicrosoft KBのコードは、私が理解できる限り、うまく機能しません。これは、memberOf属性からの照会を試みています。グループ情報は、memberOf属性からは常に利用可能なわけではありません。

私はAccountManagementを使用してIsInRole()関数を書きました。私はこれがあなたが望むものだと思います。 IsInRole()関数は、ユーザーが属するすべてのグループを見つけるために、再帰関数IsInGroup()を呼び出します。

private bool IsInRole(string domain, string username, string password, string role) 
{ 
    using (var context = new PrincipalContext(ContextType.Domain, domain, username, password)) 
    { 
     GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, role); 
     UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username); 
     return IsInGroup(user, group); 
    } 
} 

private bool IsInGroup(Principal principal, GroupPrincipal group) 
{ 
    if (principal.IsMemberOf(group)) 
     return true; 

    foreach (var g in principal.GetGroups()) 
    { 
     if (IsInGroup(g, group)) 
      return true; 
    } 

    return false; 
} 

このIsInRole()関数を使用するには、ドメイン名とドメインの資格情報を指定する必要があります。入力されたユーザー名とパスワードが間違っていると、例外が発生します。

AccountManagement APIを使用するには、.NET 3.5 SP1が必要です。また、このhotfixに注意してください。 AccountManagement APIには、いくつかの環境で実行されている場合にいくつかのバグがあります。修正プログラムを適用する必要があります。