2010-11-16 10 views
1

Dans mon Active Directory (my.domain), j'ai beaucoup de groupes (UserGrp1, UserGrp2, etc.) qui ont beaucoup d'utilisateurs. Un utilisateur peut exister dans plus d'un groupe. J'ai actuellement du code qui me permet d'utiliser la classe GroupPrincipal pour trouver un groupe, puis de là pour obtenir tous les membres de ce groupe (voir le code ci-dessous). Cependant, ce dont j'ai vraiment besoin, c'est de trouver tous les groupes auxquels appartient un utilisateur. Par exemple, j'ai un utilisateur de domaine nommé Joe Test (sAMAccountName = JOETEST) et j'ai besoin de trouver tous les groupes auxquels il appartient. Quelle est la meilleure façon de procéder?Recherche d'un utilisateur via le GroupPrincipal

Je peux déterminer si un utilisateur appartient à un groupe (comme ci-dessous) si je boucle tous les membres renvoyés par la méthode GetMembers(), mais cela me semble inefficace et je serais surpris s'il n'y avait pas un façon.

using (PrincipalContext ctx = new PrincipalContext(
    ContextType.Domain, "my.domain", "DC=my,DC=domain")) { 

    if (ctx != null) { 
    using (GroupPrincipal gp = GroupPrincipal.FindByIdentity(ctx, "UserGrp1")) { 
     // Get all group members 
     PrincipalSearchResult<Principal> psr = gp.GetMembers(); 
     foreach (Principal p in psr) { 
     // other logic 
     } 
    } 
    } 
} 

Merci d'avance pour toute aide que je reçois à ce sujet.

Répondre

3

le faire en utilisant UserPrincipal.GetGroups();

Pour un code complet ici il est

/// <summary> 
/// Gets a list of the users group memberships 
/// </summary> 
/// <param name="sUserName">The user you want to get the group memberships</param> 
/// <returns>Returns an arraylist of group memberships</returns> 
public ArrayList GetUserGroups(string sUserName) 
{ 
    ArrayList myItems = new ArrayList(); 
    UserPrincipal oUserPrincipal = GetUser(sUserName); 

    PrincipalSearchResult<Principal> oPrincipalSearchResult = oUserPrincipal.GetGroups(); 

    foreach (Principal oResult in oPrincipalSearchResult) 
    { 
     myItems.Add(oResult.Name); 
    } 
    return myItems; 
} 



/// <summary> 
/// Gets a certain user on Active Directory 
/// </summary> 
/// <param name="sUserName">The username to get</param> 
/// <returns>Returns the UserPrincipal Object</returns> 
public UserPrincipal GetUser(string sUserName) 
{ 
    PrincipalContext oPrincipalContext = GetPrincipalContext(); 

    UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName); 
    return oUserPrincipal; 
} 


/// <summary> 
/// Gets the base principal context 
/// </summary> 
/// <returns>Retruns the PrincipalContext object</returns> 
public PrincipalContext GetPrincipalContext() 
{ 
    PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sDefaultOU, ContextOptions.SimpleBind, sServiceUser, sServicePassword); 
    return oPrincipalContext; 
} 

ou pour une référence complète AD aller here.

+0

Merci, Raymund! Je ne peux pas croire que j'ai raté la méthode GetGroups() dans UserPrincipal. Il me regardait droit dans le visage! – Jagd

+0

Lol! Je ne pense pas que cela arrive à tout le monde – Raymund