Членство в группе LDAP (включая пользователей домена) - PullRequest
4 голосов
/ 14 декабря 2010

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

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

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

Это то, что я вижу при просмотре через LDAP (то есть без расширений MS): alt text

Ответы [ 3 ]

5 голосов
/ 17 декабря 2010

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

4 голосов
/ 15 декабря 2010

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

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

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

EDIT

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

alt text

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

alt text

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

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

alt text

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

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