2011-02-04 4 views
8

Код ниже получает мне пользователей в группе, но она возвращается "CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com"получить имена пользователей в группу Active Directory с помощью .net

Я хочу просто вернуть имя и фамилию. Как я могу это сделать?

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

Следующая не совсем ответ, просто предупреждение: обернуть DirectoryEntry, DirectorySearcher и особенно любые SearchResultCollections (например, от вызова [DirectorySearcher.FindAll] (HTTP : //msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx)) в операторе using или try/finally с вызовом Dispose. SearchResultCollections нельзя собирать мусор. Я искал утечку памяти в течение нескольких дней после использования примера, который я нашел в Интернете, который ничего не утилизировал. Внимательно проверьте документацию по MS, чтобы узнать, какие классы участвуют в поиске Active Directory hav. –

ответ

22

Я предпочитаю использовать классы в System.DirectoryServices.AccountManagement:

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

Поиск через свойство group.Members до тех пор, пока есть Principal, что вы хотите. Затем извлечь имя вроде этого:

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

Вам необходимо добавить ссылку на ** System.DirectoryServices.AccountManagement ** ваш проект. – bigtlb

+1

Отличный ответ! Спасибо – Eric

2

Использования кода, тем GivenName (первого имя) и зпа (фамилии) свойств должны работать.

При использовании System.DIrectoryServices.AccountManagement имен UserPrincipal (как @ рассел-МакКлюры предложили), вы найдете GivenName и Фамилии свойства также.

AccountManagement очень удобен, если вам не нужно проходить через доверенный лес и нужен глобальный каталог, чтобы найти пользователя.

+0

Бьюсь об заклад, он также должен установить PropertiesToLoad http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.propertiestoload.aspx –

+0

В моем коде, поражающем Windows Server 2008 DC под .Net 4.0 , Я получаю 24 свойства по умолчанию, не изменяя PropertiesToLoad в моем DirectorySearcher, включая givenName и sn ... – bigtlb

+0

Я не могу использовать управление учетными записями, потому что оно не существует в моем пространстве имен directoryservices. – Eric

0

Это сценарий PowerShell, который я сделал для этого, не используя классы AccountManagement. Он должен быть достаточно легким, чтобы перевести его на 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"]; 
    } 
} 
Смежные вопросы