Членство в группе 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"];
}
}