2011-03-09 21 views
6

Estoy tratando de usar GroupPrincipal (parte del espacio de nombres System.DirectoryServices.AccountManagement) para completar una lista de tipo cadena, de modo que pueda verificar si un usuario es miembro de un grupo de Active Directory. Esta es la clase editada que he escrito hasta ahora:Membresías de grupos de usuarios de Active Directory GroupPrincipal

public class ActiveDirectoryMembership 
{ 
    private PrincipalContext context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName); 
    private List<string> GroupName {get;set;} 

    public ActiveDirectoryMembership() 
    { 
     //Code snipped - this part returns a list of users 
     populateGroups(); 
    } 

    private void populateGroups() 
    { 
     GroupPrincipal SearchGroup = GroupPrincipal.FindByIdentity(context, "Group Name"); 
     GroupName = new List<string>(); 
     foreach (UserPrincipal p in GroupName.GetMembers()) 
     { 
      GroupName.add(p.SamAccountName); 
     } 
    } 

Entonces, ¿dónde me estoy equivocando?

Gracias de antemano :)

+2

¿Qué ves, ¿qué esperas ** ** ver? ?? –

+1

Matt esta no es una pregunta real, ¿cómo funciona este código? ¿Qué resultados obtienes? ¿Cómo se comporta en el momento de la depuración si se consulta con puntos de interrupción? ¿Qué quieres obtener diferente de lo que estás obteniendo ahora? –

+1

Disculpe, no recibo una lista de usuarios; el valor de GroupName es nulo. Espero ver una lista de usuarios (sé que hay usuarios que son miembros de ese grupo), ¿tiene sentido? – Matt

Respuesta

0

yo creo que hay un error tipográfico simple en su forma - que está recibiendo el director de grupo en SearchGroup (para comprobar NULL, por cierto !!) y luego te están agarrando los miembros de GroupName ??

Prueba esto:

private void populateGroups() 
{ 
    GroupPrincipal SearchGroup = GroupPrincipal.FindByIdentity(context, "Group Name"); 

    if(SearchGroup != null) 
    { 
     GroupName = new List<string>(); 

     // call 'GetMembers' on 'SearchGroup' here!! 
     foreach (UserPrincipal p in SearchGroup.GetMembers()) 
     { 
      GroupName.add(p.SamAccountName); 
     } 
    } 
} 
+1

No obtengo un error de tiempo de ejecución/compilación. ¿Debo llenar el valor de P (proporcionándome una lista de usuarios a los que pasar por el ciclo antes de ejecutar el ciclo foreach? – Matt

+2

Ignorarme por completo - mi prueba estaba sonando con mi cabeza - Lo hice assert.isnull y no assert.isnotnull - ¡Todo está bien ahora! – Matt

3

Esta modificación de su código funciona (he hecho pruebas para asegurarse):

private static readonly string DomainName = "domaincontrollercomputer.domain.com"; 
    private static readonly string DomainContainer = "DC=DOMAIN,DC=COM"; 
    private static readonly string ADGroupName = "AD Group Name"; 
    private List<string> GroupName {get;set;} 

    private void populateGroups() 
    { 
     using (var ctx = new PrincipalContext(ContextType.Domain, DomainName, DomainContainer)) 
     { 
      using (var grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, ADGroupName)) 
      { 
       GroupName = new List<string>(); 
       foreach (var member in grp.GetMembers()) 
       { 
        GroupName.Add(member.SamAccountName); 
       } 
      } 
     } 
    } 
Cuestiones relacionadas