2013-04-25 92 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歷史,那麼這將工作正常(但我認爲你不能編輯組的sid值)GetAuthorizationGroups()拋出異常

+3

發佈異常將是一個良好的開端。 – 2013-04-25 18:34:33

回答

16

我發現那裏將域用戶添加到本地組時出現問題,但後來將該域用戶從Active Directory中刪除。該本地組的狀態是,而不是顯示爲成員的域用戶名,而是使用SID。

但是!

SID在Active Directory中不再存在,導致事情變得繁榮。

當然,還有許多其他原因會導致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

你注意得很好。好的解決方案 – 2015-06-12 12:10:30

+1

@ S.Pols謝謝,這是追查的熊。我想最終,我結束了剝離,並使用WindowsPrincipal.IsInRole(字符串)。但很高興這個解決方案有幫在某些環境中查詢Active Directory的速度可能非常慢 – matrixugly 2015-06-12 18:39:14

+1

工作起來像一個魅力 – Gandarez 2015-06-16 12:28:51