2013-04-25 16 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 
    } 
} 

Czy muszę zezwolić na jakieś pozwolenie? W niektórych blogach dowiedziałem się, że jeśli nie ma użytkowników, którzy są włączeni do historii SID, to będzie działać poprawnie (ale myślę, że nie można edytować wartości sid grup)GetAuthorizationGroups() rzuca wyjątek

+3

zamieszczaniu wyjątek byłby dobrym miejscem, aby rozpocząć. –

Odpowiedz

16

Znalazłem, że jest problem podczas dodawania użytkownika domeny do grupy lokalnej, ale później ten użytkownik domeny jest usuwany z Active Directory. Stan tej grupy lokalnej polega na tym, że zamiast nazwy użytkownika domeny wyświetlanej jako członek, używany jest identyfikator SID.

ALE!

Ten identyfikator SID już nie istnieje w usłudze Active Directory, co powoduje, że sytuacja się rozwija.

Oczywiście może być wiele innych powodów, dla których wyskoczy wyjątek NoMatchingPrincipalException, więc ten kod zapewnia obejście tego problemu. Pochodzi ze świetnego postu na MSDN. Poniższy kod jest zmodyfikowana wersja znaleźć tutaj:

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

Zauważyłeś to bardzo dobrze. Świetne rozwiązanie! –

+1

@ S.Pols Dzięki, To był niedźwiedź do wyśledzenia. Myślę, że ostatecznie, skończyłem rozbierać to i używając WindowsPrincipal.IsInRole (ciąg). Ale cieszę się, że to rozwiązanie pomaga. Odpowiadanie Active Directory może być naprawdę powolne w niektórych środowiskach – matrixugly

+1

Działa jak urok – Gandarez

Powiązane problemy