4

如何获取 LDAP 组中的用户列表,即使该组恰好是某些用户的主要组?

例如,假设“域用户”在德语中是“域 Leute”。我想要“CN=Domain Leute,DC=mycompany,DC=com”的所有成员。我怎么知道那是著名的“域用户”组?

或者如果某些用户的主要组更改为“CN=rebels,DC=mycompany,DC=com”,我想获得该组的成员怎么办?用户的主组没有 memberOf 属性,主组也没有列出他们的成员属性。

这是我通过 LDAP 查看时看到的(即,没有 MS 扩展): 替代文字

4

3 回答 3

6

要从任何给定组中获取primaryGroupToken,请从objectSid 中提取它,例如Domain Users objectSid =S-1-5-21-704657944-2065781323-617630493-513然后primaryGroupToken是“-”之后的最后一位数字,因此对于“Domain Users”,其513

于 2010-12-16T22:47:40.073 回答
4

您需要先从 Group 对象中找出 primaryGroupToken。如果您使用的是 ADSIEdit,则需要确保已启用“构造”过滤器才能查看此计算属性。对于域用户,primaryGroupToken 应该是 513。

然后,您需要找到所有将 primaryGroupID 设置为该值的用户。这是您应该编写的 ldap 查询,以找出所有将域用户设置为主要组的用户。

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

编辑

以下是在 LDAP 浏览器中显示 primaryGroupToken 的步骤。我正在使用 LDAP 浏览器 2.6 build 650。右键单击您的配置文件,然后单击属性

替代文字

转到 LDAP 设置选项卡,然后单击高级按钮。

替代文字

添加额外的操作属性primaryGroupToken

单击应用按钮并关闭属性页面。现在,您应该在您的组对象中看到primaryGroupToken 。

替代文字

于 2010-12-15T07:05:03.420 回答
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"];
    }
}
于 2017-01-20T12:44:42.257 回答