如何获取LDAP组中的用户列表,即使该组恰好是某些用户的主要组?
例如,假设“Domain Users”是德语中的“Domain Leute”。我想要“CN = Domain Leute,DC = mycompany,DC = com”的所有成员。我怎么知道这是众所周知的“域用户”组?
或者,如果某些用户的主要组被更改为“CN = rebels,DC = mycompany,DC = com”,我想要获得该组的成员?用户的主要组没有memberOf属性,主要组没有列出它们的成员属性。
这是我通过LDAP查看时看到的内容(即没有MS扩展名):
答案 0 :(得分:5)
要从任何给定的组中获取primaryGroupToken,请从objectSid中提取它,例如域用户 objectSid = S-1-5-21-704657944-2065781323-617630493-513
,然后 primaryGroupToken 是最后的数字在“ - ”之后所以在“域用户”的情况下为513
答案 1 :(得分:4)
您需要先从Group对象中找出primaryGroupToken。如果您使用的是ADSIEdit,则需要确保已打开“Constructed”过滤器以查看此计算属性。对于域用户,primaryGroupToken应为513。
然后,您需要找到将primaryGroupID设置为此值的所有用户。以下是您应编写的ldap查询,以查找将Domain Users设置为主要组的所有用户。
(&(objectCategory=person)(objectClass=user)(primaryGroupID=513))
修改强>
以下是在LDAP浏览器中显示primaryGroupToken的步骤。我正在使用LDAP浏览器2.6 build 650.右键单击您的配置文件,然后单击属性
转到“LDAP设置”选项卡,然后单击“高级”按钮。
添加额外的操作属性 primaryGroupToken
点击应用按钮,然后关闭属性页面。现在,您应该在组对象中看到 primaryGroupToken 。
答案 2 :(得分: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"];
}
}