2011-03-09 34 views
6

Sto cercando di utilizzare GroupPrincipal (parte dello spazio dei nomi System.DirectoryServices.AccountManagement) per compilare un elenco di tipo stringa, in modo da poter verificare se un utente è un membro di un gruppo di Active Directory. Ecco la classe modificata che ho scritto finora:Membri gruppo utenti Active Directory GruppoPrincipal

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

Quindi, dove sto andando male?

Grazie in anticipo :)

+2

Che cosa vedi, cosa ** ** aspetterebbe di vedere? ?? –

+1

Matt questa non è una vera domanda, come funziona questo codice? Quali risultati ottieni? Come si comporta in fase di debug se si controlla con i breakpoint? Cosa vuoi ottenere in modo diverso da quello che stai ricevendo ora? –

+1

Siamo spiacenti, non sto ottenendo un elenco di utenti; il valore di GroupName è nullo. Mi aspetto di vedere un elenco di utenti (so che ci sono utenti che fanno parte di quel gruppo) - ha senso? – Matt

risposta

0

Penso che tu abbia un semplice errore di battitura nel metodo - che stai ricevendo il principale gruppo in SearchGroup (verificare la presenza di NULL, btw !!) e poi sei afferrando i membri fuori GroupName ??

Prova questo:

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

Im non ottenere un errore di run-time/compile. Devo compilare il valore di P (in modo efficace fornirmi un elenco di utenti per eseguire il ciclo prima di eseguire il ciclo foreach? – Matt

+2

Completamente ignorami: il mio test stava giocando con la mia testa - ho asserito.isnull e non assert.isnotnull - Tutto è ok ora! – Matt

3

Questa modifica del vostro codice funziona (ho fatto i test per garantire):

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); 
       } 
      } 
     } 
    } 
Problemi correlati