2011-02-04 31 views
8

Il codice sotto di me ottiene gli utenti nel gruppo, ma viene restituito "CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com"ottenere i nomi utente in un gruppo di Active Directory tramite .net

voglio tornare solo il Cognome e nome. Come posso realizzare questo?

DirectoryEntry ou = new DirectoryEntry(); 
DirectorySearcher src = new DirectorySearcher(); 

src.Filter = ("(&(objectClass=group)(CN=Gname))"); 
SearchResult res = src.FindOne(); 
if (res != null) 
{ 
    DirectoryEntry deGroup = new DirectoryEntry(res.Path); 
    PropertyCollection pcoll = deGroup.Properties; 

    foreach (object obj in deGroup.Properties["member"]) 
    { 
      ListBox1.Items.Add(obj.ToString()); 
    } 
} 
+0

Quanto segue non è davvero una risposta, solo un avvertimento: avvolgere la DirectoryEntry, DirectorySearcher e soprattutto eventuali SearchResultCollections (ad esempio da chiamare [DirectorySearcher.FindAll] (http : //msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx)) in un'istruzione using, o un try/finally con una chiamata Dispose. SearchResultCollections non può essere garbage collection. Ho rintracciato una perdita di memoria per giorni dopo aver usato un esempio che ho trovato online che non ha eliminato nulla. Controllare attentamente la documentazione MS per vedere quali classi sono coinvolte nella ricerca di Active Directory hav –

risposta

22

preferisco utilizzando le classi in System.DirectoryServices.AccountManagement:

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "GName"); 

Ricerca attraverso la proprietà group.Members fino ad avere un Principal che si desidera. Poi estrarre il nome come questo:

foreach (Principal principal in group.Members) 
{ 
    string name = principal.Name; 
} 
+4

È necessario aggiungere un riferimento a ** System.DirectoryServices.AccountManagement ** il proprio progetto. – bigtlb

+1

Ottima risposta! Grazie – Eric

2

Utilizzando il codice, il givenName (nome) e sn (cognome) proprietà devono lavorare.

Se si utilizza lo spazio System.DirectoryServices.AccountManagement UserPrincipal (come @ russell-McClure suggerito), troverete GivenName e cognome proprietà anche.

AccountManagement è molto utile a meno che non si debba attraversare una foresta attendibile e sia necessario il catalogo globale per trovare l'utente.

+0

Scommetto che ha anche bisogno di impostare PropertiesToLoad http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.propertiestoload.aspx –

+0

Nel mio codice colpire un Windows Server 2008 DC con .Net 4.0 , Ottengo 24 proprietà di default senza modificare PropertiesToLoad nel mio DirectorySearcher, incluso givenName e sn ... – bigtlb

+0

Non riesco a utilizzare l'accountmanagement perché non esiste nel mio spazio dei nomi directoryservices. – Eric

0

Questo è uno script PowerShell che ho creato per farlo senza utilizzare le classi di AccountManagement. Dovrebbe essere abbastanza facile da tradurre in C#:

[void][System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices"); 

$groupName = "Grupo Domain"; 

$directoryEntry = New-Object System.DirectoryServices.DirectoryEntry; 
$directorySearcher = New-Object System.DirectoryServices.DirectorySearcher($directoryEntry, "(&(objectClass=group)(CN=$groupName))"); 
[void]$directorySearcher.PropertiesToLoad.Add("objectSid"); 
[void]$directorySearcher.PropertiesToLoad.Add("member"); 
$result = $directorySearcher.FindOne(); 

if ($result -eq $null) { return; } 

# Try get the group members through the "member" property. 
if ($result.Properties["member"].Count -gt 0) { 
    foreach ($member in $result.Properties["member"]) { 
     $memberSearcher = New-Object System.DirectoryServices.DirectorySearcher($directoryEntry, "(&(objectClass=*)(distinguishedName=$member))"); 
     [void]$memberSearcher.PropertiesToLoad.Add("msDS-PrincipalName"); 
     $memberResult = $memberSearcher.FindOne(); 
     if ($memberResult -eq $null) { continue; } 
     Write-Output $memberResult.Properties["msDS-PrincipalName"]; 
    } 
    return; 
} 
if ($result.Properties["objectSid"].Count -gt 0) { 
    # The group might be an AD primary group. Try get the members by the PrimaryGroupID. 
    $groupSid = New-Object System.Security.Principal.SecurityIdentifier($result.Properties["objectSid"][0], 0); 
    # Hacky way to get only the last RID. 
    $primaryGroupSid = $groupSid.Value.Replace($groupSid.AccountDomainSid.ToString(), [String]::Empty).TrimStart('-'); 
    $memberSearcher = New-Object System.DirectoryServices.DirectorySearcher($directoryEntry, "(&(objectClass=*)(primaryGroupId=$primaryGroupSid))"); 
    [void]$memberSearcher.PropertiesToLoad.Add("msDS-PrincipalName"); 
    $memberResult = $memberSearcher.FindAll(); 
    if ($memberResult -eq $null) { continue; } 
    foreach ($member in $memberResult) { 
     Write-Output $member.Properties["msDS-PrincipalName"]; 
    } 
} 
Problemi correlati