2010-12-14 7 views
4

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

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

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

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

ответ

4

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

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

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

EDIT

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

alt text

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

alt text

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

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

alt text

+0

И это в основном мой вопрос - как узнать основную группугрупп из любой группы? (Надеюсь, используя вызовы LDAP) – DougN

+0

Пожалуйста, дайте мне знать, какие инструменты вы используете. Я мог бы получить его с помощью ldp.exe, adsiedit.msc или даже кода C#. Я не знаю, какую проблему вы видите при попытке получить primaryGroupToken. –

+0

Я ищу CN = Пользователи домена, CN = Пользователи, DC = mydomain.Я использую браузер LDAP от Softerra (бесплатный - очень хороший), поэтому чистый LDAP без каких-либо расширений MS. Нет атрибутов, которые равны 513 или даже могут быть скручены в 513 :) – DougN

5

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

0

Это представляет собой 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"]; 
    } 
} 
Смежные вопросы