6

Estoy usando ASP.net con C# y tengo muy poca idea sobre Active Directory. Me han dado una tarea de escribir un programa en los pasos siguientes:Averiguar si un grupo en AD está en el grupo de distribución?

La aplicación ASP.net se le da el nombre de usuario de un usuario.

La aplicación debe consultar a todos los grupos del usuario con el nombre de usuario dado.

continuación, la aplicación debe mostrar estos grupos en dos listas separadas una que consiste en los grupos de distribución y en otra lista, el resto de los grupos.

Ahora, la consulta de todos los grupos es fácil. ¿Pero cómo puedo verificar si el grupo está en el grupo de distribución o no?

No me han dado más información.

¿Algún atributo o algo que pueda verificar?

Respuesta

3

Usted puede retreive esta información de un atributo llamado Groupe-Type (última línea).

(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. 

puede encontrar en this answer o en la parte de abajo de this other one maneras diferentes grupos es posible recuperar un usuario pertenece.

puede encontrar here cómo retreive usuario.

+0

No estoy seguro de su respuesta todavía. ¡Porque aún no he descubierto qué está pasando allí! Pero no te pregunto a qué te refieres porque me gustaría descubrirme a mí mismo ya que ahora tengo tiempo. Muchas gracias sin embargo. – PPGoodMan

2

Ya que estás en .NET 3.5 y arriba, usted debe comprobar el espacio de nombres System.DirectoryServices.AccountManagement (S.DS.AM). Leer todos los detalles aquí:

Básicamente, se puede definir un contexto de dominio y encontrar fácilmente los usuarios y/o grupos en el año:

// 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); 
     } 
    } 
} 

El ¡El nuevo S.DS.AM hace que sea muy fácil jugar con usuarios y grupos en AD!

+0

Muchas gracias. Esto parece funcionar Da dos listas bien, pero la administración afirma que las dos listas están equivocadas. Lo que significa que algunos grupos de distribución se encuentran en la lista de grupos de seguridad. Quizás están equivocados. De todos modos, muchas gracias. Por cierto, se me ocurrió este extraño error al compilar: '¿No se puede convertir implícitamente el tipo 'bool'? para 'bool'. Existe una conversión explícita (¿falta un elenco?) '. Estuvo bien cuando lo lanzaron a bool. ¿Pero qué diablos es este tipo de datos 'bool'? ??? ¡Nunca lo oí! – PPGoodMan

+0

@PPGoodMan: eso es ** bool nullable **, lo que significa que podría ser NULL, verdadero o falso. –

3

Este código recuperará todos sus grupos habilitados para correo electrónico, independientemente de si se trata de un grupo de seguridad o distribución. (Habiendo visto tu comentario en la respuesta de marc_s, supongo que esto es realmente lo que están buscando los gerentes).

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); 
      } 
     } 
    } 
} 
Cuestiones relacionadas