LDAP组成员资格(包括域用户)

时间:2010-12-14 20:23:38

标签: active-directory ldap member adsi ldap-query

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

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

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

这是我通过LDAP查看时看到的内容(即没有MS扩展名): alt text

3 个答案:

答案 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.右键单击您的配置文件,然后单击属性

alt text

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

alt text

添加额外的操作属性 primaryGroupToken

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

alt text

答案 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"];
    }
}