Членство в группе LDAP (включая пользователей домена)

Как я могу получить список пользователей в группе LDAP, даже если эта группа является основной группой для некоторых пользователей?

Например, предположим, что "Domain Users" на немецком означает "Domain Leute". Я хочу, чтобы все члены "CN=Domain Leute,DC=mycompany,DC=com". Откуда мне знать, что это известная группа "Пользователи домена"?

Или что, если основная группа некоторых пользователей была изменена на "CN = повстанцы,DC=mycompany,DC=com", и я хотел бы получить членов этой группы? У пользователей нет свойства memberOf для их основной группы, и у основной группы не будет свойства member, перечисляющего их.

Вот что я вижу при просмотре через LDAP (то есть без расширений MS):альтернативный текст

3 ответа

Решение

Сначала вам нужно выяснить primaryGroupToken из объекта Group. Если вы используете ADSIEdit, вам нужно убедиться, что у вас включен фильтр "Построен", чтобы увидеть этот вычисленный атрибут. Для пользователей домена primaryGroupToken должен быть 513.

Затем вам нужно найти всех пользователей, у которых primaryGroupID имеет это значение. Вот запрос ldap, который вы должны написать, чтобы узнать всех пользователей, у которых в качестве основной группы заданы пользователи домена.

(&(objectCategory=person)(objectClass=user)(primaryGroupID=513))

РЕДАКТИРОВАТЬ

Вот шаги, чтобы показать primaryGroupToken в браузере LDAP. Я использую LDAP browser 2.6 build 650. Щелкните правой кнопкой мыши свой профиль и выберите Свойства

альтернативный текст

Перейдите на вкладку "Настройки LDAP" и нажмите кнопку "Дополнительно".

альтернативный текст

Добавьте дополнительный операционный атрибут primaryGroupToken

Нажмите кнопку Применить и закройте страницу свойств. Теперь вы должны увидеть primaryGroupToken в объекте вашей группы.

альтернативный текст

Чтобы получить primaryGroupToken из любой данной группы, извлеките его из objectSid, например, Domain Users objectSid = S-1-5-21-704657944-2065781323-617630493-513 затем primaryGroupToken - это последние цифры после "-", поэтому в случае "пользователей домена" его 513

Это сценарий PS, который я сделал, чтобы сделать именно это:

[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"];
    }
}
Другие вопросы по тегам