получить имена пользователей в группе Active Directory через .net - PullRequest
11 голосов
/ 04 февраля 2011

Приведенный ниже код возвращает мне пользователей в группе, но он возвращается "CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com"

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

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

Ответы [ 3 ]

29 голосов
/ 04 февраля 2011

Я предпочитаю использовать классы в 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;
}
2 голосов
/ 04 февраля 2011

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

Если вы используете пространство имен System.DIrectoryServices.AccountManagement UserPrincipal (как предложено @ russell-mcclure), вы также найдете свойства GivenName и Фамилия .

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

0 голосов
/ 20 января 2017

Это сценарий 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"];
    }
}
...