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

Active directory LDAP组成员资格(包括域用户),active-directory,ldap,member,adsi,ldap-query,Active Directory,Ldap,Member,Adsi,Ldap Query,如何获取LDAP组中的用户列表,即使该组恰好是某些用户的主要组 例如,假设“域用户”在德语中是“Domain Leute”。我想要“CN=Domain Leute,DC=mycompany,DC=com”的所有成员。我怎么知道这是著名的“域用户”组 或者,如果一些用户的主要组被更改为“CN=叛军,DC=mycompany,DC=com”,而我想要获得该组的成员,该怎么办?用户的主组没有memberOf属性,主组也没有列出他们的memberOf属性 这是我通过LDAP查看时看到的(即,没有MS扩展

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

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

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

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

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

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

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

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

转到LDAP设置选项卡并单击高级按钮

添加额外的操作属性primaryGroupToken

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


要从任何给定组获取primaryGroupToken,请从objectSid中提取它,例如域用户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"];
    }
}

这基本上就是我的问题——如何从任何给定的组中找到primaryGroupToken?(希望使用LDAP调用)请告诉我您正在使用什么工具。我可以使用ldp.exe、adsiedit.msc甚至C#code获得它。我不知道您在尝试检索PrimaryGroupToken时看到了什么问题。我看到的是CN=Domain用户,CN=Users,DC=mydomain。我使用的是Softerra的LDAP浏览器(免费——也很不错),所以是纯LDAP,没有任何MS扩展。没有等于513的属性,或者甚至可以扭曲成513:)@DougN:我刚刚下载了LDAP浏览器,它也可以工作,但它需要更多的配置。您需要右键单击您的配置文件并查看属性。在属性页面中,转到LDAP设置选项卡。单击高级按钮。转到“显示的属性”选项卡。确保选择了“显示操作属性”。然后,您可以从下面的列表中选择“显示额外的操作属性”。单击“新建buton”并在那里添加“primaryTokenGroup”。@DougN我的答案有什么问题?为什么您不能接受?