7 votes

Découvrez si un groupe dans AD est dans un groupe de distribution ?

J'utilise ASP.net avec C# et j'ai très peu d'idée sur Active Directory. On m'a confié la tâche d'écrire un programme en suivant les étapes ci-dessous :

L'application ASP.net reçoit le nom d'utilisateur d'un utilisateur.

L'application doit interroger tous les groupes de l'utilisateur avec le nom d'utilisateur donné.

L'application doit ensuite afficher ces groupes dans deux listes distinctes, l'une comprenant les groupes de distribution et l'autre, le reste des groupes.

Maintenant, l'interrogation de tous les groupes est facile. Mais comment puis-je vérifier si le groupe est dans le groupe de distribution ou non ?

On ne m'a pas donné plus d'informations.

Un attribut ou quelque chose que je peux vérifier ?

3voto

JPBlanc Points 26156

Vous pouvez obtenir cette information à partir d'un attribut appelé Type de groupe (dernière ligne).

(0x00000001) : Specifies a group that is created by the system.
(0x00000002) : Specifies a group with global scope.
(0x00000004) : Specifies a group with domain local scope.
(0x00000008) : Specifies a group with universal scope.
(0x00000010) : Specifies an APP_BASIC group for Windows Server Authorization Manager.
(0x00000020) : Specifies an APP_QUERY group fir Windows Server Authorization Manager.
(0x80000000) :Specifies a security group. If this flag is not set, then the group is a distribution group.

Vous pouvez trouver dans cette réponse ou au bas de la page cet autre différentes manières de retrouver les groupes auxquels un utilisateur appartient.

Vous pouvez trouver aquí comment récupérer l'utilisateur.

3voto

marc_s Points 321990

Puisque vous utilisez .NET 3.5 et plus, vous devriez consulter le site Web de la Commission européenne. System.DirectoryServices.AccountManagement (S.DS.AM). Lisez tout à ce sujet ici :

En gros, vous pouvez définir un contexte de domaine et trouver facilement des utilisateurs et/ou des groupes dans AD :

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{ 
   // get all roles for that user
   var roles = user.GetGroups();

   // set up two lists for each type of groups
   List<GroupPrincipal> securityGroups = new List<GroupPrincipal>();
   List<GroupPrincipal> distributionGroups = new List<GroupPrincipal>();

   // iterate over groups found
   foreach (Principal p in roles)
   {
       // cast to GroupPrincipal
       GroupPrincipal gp = (p as GroupPrincipal);

       if (gp != null)
       {
           // check whether it's a security group or a distribution group
           if (gp.IsSecurityGroup)
              securityGroups.Add(gp);
           else
              distributionGroups.Add(gp);
       }
    }
}

Le nouveau S.DS.AM permet de jouer très facilement avec les utilisateurs et les groupes dans AD !

3voto

Cavyn VonDeylen Points 1151

Ce code récupérera tous vos groupes activés par courriel, qu'il s'agisse d'un groupe de sécurité ou de distribution. (Ayant vu votre commentaire à la réponse de marc_s, je suppose que c'est en fait ce que vos managers recherchent).

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    Principal prototype = new GroupPrincipal(ctx);
    PrincipalSearcher searcher = new PrincipalSearcher(prototype);
    List<string> groupNames = new List<string>();
    PropertyValueCollection email;

    foreach (var gp in searcher.FindAll()) using (gp)
    {
        GroupPrincipal group = gp as GroupPrincipal;

        using (DirectoryEntry groupEntry = ((DirectoryEntry)group.GetUnderlyingObject())
        {
          email = groupEntry.Properties["mail"];
          if (email.Value != null)
          {
            groupNames.Add(group.Name);
          }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X