2013-04-25 4 views
13
PrincipalContext context = new PrincipalContext(ContextType.Domain, "ipofmachine", "DC=xyz,DC=org", "username", "Password"); 

UserPrincipal userPrinciple = UserPrincipal.FindByIdentity(context, "User0"); 
var groups = userPrinciple.GetAuthorizationGroups(); 

if (userPrinciple != null) 
{ 
    foreach (GroupPrincipal gp in groups) 
    { 
     //some thing 
    } 
} 

必要な権限はありますか?いくつかのブログでは、SIDの履歴を含めるように設定されているユーザーがいない場合、これは正常に機能することが分かった(ただし、グループのID値を編集できないと思う)。GetAuthorizationGroups()が例外をスローしています

+3

例外を投稿すると、開始するには良い場所でしょう。 –

答えて

16

ドメインユーザーをローカルグループに追加すると、後でそのドメインユーザーがActive Directoryから削除されるときの問題です。そのローカルグループの状態は、ドメインユーザー名がメンバーとして表示される代わりに、代わりにSIDが使用されることです。

BUT!

Active DirectoryにはSIDが存在しないため、何も起こりません。

もちろん、NoMatchingPrincipalExceptionがポップアップする理由は他にもたくさんある可能性があります。そのため、このコードは回避策を提供します。それはMSDNの素晴らしい投稿から来ています。以下のコードは、変更されたバージョンがここに発見された:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/9dd81553-3539-4281-addd-3eb75e6e4d5d/getauthorizationgroups-fails-with-nomatchingprincipalexception

public static IEnumerable<Principal> getAuthorizationGroups(UserPrincipal user) 
    { 
     PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups(); 
     List<Principal> ret = new List<Principal>(); 
     var iterGroup = groups.GetEnumerator(); 
     using (iterGroup) 
     { 
      while (iterGroup.MoveNext()) 
      { 
       try 
       { 
        Principal p = iterGroup.Current; 
        Console.WriteLine(p.Name); 
        ret.Add(p); 
       } 
       catch (NoMatchingPrincipalException pex) 
       { 
        continue; 
       } 
      } 
     } 
     return ret; 
    } 
+1

あなたはそれに気づいた。素晴らしい解決策! –

+1

@ S.Polsありがとう、それは追跡するクマでした。私は最終的に、私はこれを取り除き、WindowsPrincipal.IsInRole(文字列)を使用して終わったと思います。しかし、このソリューションはうれしいです。 Active Directoryのクエリは、一部の環境では実際には遅くなる可能性があります。 – matrixugly

+1

魅力的な作品 – Gandarez

関連する問題