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

C'è qualche permesso che devo dare? In alcuni dei blog ho appreso che se non ci sono utenti che sono impostati per includere la cronologia SID, funzionerà correttamente (ma penso che non sia possibile modificare i valori sid dei gruppi)GetAuthorizationGroups() sta generando un'eccezione

+3

Distacco l'eccezione sarebbe un buon punto di partenza. –

risposta

16

Ho trovato che c'è un problema quando si aggiunge un utente di dominio a un gruppo locale, ma successivamente tale utente di dominio viene eliminato da Active Directory. Lo stato di quel gruppo locale è che al posto di un nome utente di dominio visualizzato come membro, viene utilizzato il SID.

MA!

Quel SID non esiste più in Active Directory causando il boom delle cose.

Ovviamente ci possono essere molti altri motivi per cui deve essere visualizzata una NoMatchingPrincipalException, quindi questo codice fornisce una soluzione alternativa. Viene da un post eccezionale su MSDN. Il codice che segue è una versione modificata trovato qui:

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

Lo hai notato molto bene. Ottima soluzione! –

+1

@ S.Pols Grazie, Quello era un orso da rintracciare. Penso che alla fine, ho finito per spogliarlo e utilizzare WindowsPrincipal.IsInRole (stringa). Ma felice questa soluzione aiuta. La ricerca di Active Directory può essere molto lenta in alcuni ambienti – matrixugly

+1

Funziona come un incantesimo – Gandarez

Problemi correlati