【问题标题】:LDAP group membership (including Domain Users)LDAP 组成员资格(包括域用户)
【发布时间】:2011-05-25 12:51:50
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这是我为实现此目的而制作的 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"];
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      编辑

      这是在 LDAP 浏览器中显示 primaryGroupToken 的步骤。我正在使用 LDAP 浏览器 2.6 build 650。右键单击您的个人资料并单击属性

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

      添加额外的操作属性primaryGroupToken

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

      【讨论】:

      • 这基本上是我的问题——你如何从任何给定的组中找出primaryGroupToken? (希望使用 LDAP 调用)
      • 请告诉我您使用的是什么工具。我可以使用 ldp.exe、adsiedit.msc 甚至 C# 代码来获取它。我不知道您在尝试检索 primaryGroupToken 时遇到了什么问题
      • 我正在查看 CN=Domain Users,CN=Users,DC=mydomain。我正在使用 Softerra 的 LDAP 浏览器(免费——也非常好),所以没有任何 MS 扩展的纯 LDAP。没有属性等于 513 甚至可以扭曲成 513 :)
      • @DougN:我刚刚下载了 LDAP 浏览器,它也可以工作,但需要更多配置。您需要右键单击您的个人资料并查看属性。在属性页面中,转到 LDAP 设置选项卡。单击高级按钮。转到显示的属性选项卡。确保选择了显示操作属性。然后,您可以从下面的列表中选中“显示额外的操作属性。单击新建按钮并在此处添加“primaryTokenGroup”。
      • @DougN 我的回答有什么问题?为什么不能接受?
      【解决方案3】:

      要从任何给定组中获取 primaryGroupToken,请从 objectSid 中提取它,例如 Domain Users objectSid = S-1-5-21-704657944-2065781323-617630493-513 然后 primaryGroupToken 是“-”,所以对于“域用户”,它是 513

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多