【问题标题】:Get-ADGroupMember : The size limit for this request was exceededGet-ADGroupMember :超出此请求的大小限制
【发布时间】:2018-02-15 03:51:36
【问题描述】:

我正在尝试从文本文件中拉入群组,但我的一个群组太大,有 80,000 人。

我如何让它工作 l,它会输出我想要的结果。

$groups = Get-Content c:\temp\ADGroups.txt

foreach($group in $groups) {
    @(Get-ADGroup $group -Properties Member| Select-Object -ExpandProperty Member).Count
    Get-ADGroupMember -Identity $group |
        Get-ADObject -Properties Name, DisplayName |
        Select-Object -Property @{n="Username";e={$_.Name}}, DisplayName,
            @{n="AD Group";e={$group}} |
        Export-Csv C:\Users\Desktop\GroupsInfo.CSV -NoTypeInformation -Append
}

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    Get-ADGroupMember 可以返回的对象数量受到ADWS(Active Directory Web 服务)中的限制:

    MaxGroupOrMemberEntries

    5000

    指定 Active Directory 模块 Get-ADGroupMember、Get-ADPrincipalGroupMembership 和 Get-ADAccountAuthorizationGroup cmdlet 可以检索的组成员(递归或非递归)、组成员身份和授权组的最大数量。如果您预计这些 cmdlet 在您的环境中返回超过 5000 个结果,请将此参数设置为更高的值。

    根据this thread,您应该能够通过查询组对象并扩展其member 属性来解决它(如果您无法增加服务的限制):

    Get-ADGroup $group -Properties Member |
        Select-Object -Expand Member |
        Get-ADUser -Property Name, DisplayName
    

    但请注意,这可能会很慢,因为您将发送数千个请求。构建所有用户的哈希表可能会更好:

    $users = @{}
    Get-ADUser -Filter '*' -Property Name, DisplayName | ForEach-Object {
        $users[$_.DistinguishedName] = $_
    }
    

    以便您可以通过其专有名称查找它们:

    Get-ADGroup $group -Properties Member |
        Select-Object -Expand Member |
        ForEach-Object { $users[$_] }
    

    【讨论】:

    • 注意:这里有一个陷阱。如果使用用户的主要组(通常为 Domain Users),则用户不会列在组的 members 属性中,并且组不会显示在用户的 memberof 属性中。相反,您必须查询用户的 PrimaryGroupId 属性(请参阅 reddit.com/r/PowerShell/comments/8ivat1/… 了解更多信息)
    • 注意:DSGroup 方法没有这个问题。
    • @Ansgar - 您使用 $users 哈希表的解决方案很酷,但是如何防止内存在巨大目录的情况下被阻塞? (某些组包含 >15000 个成员)和用户对象 >100K。
    【解决方案2】:

    我使用 Get-ADGroupMember 达到了 5000 个限制。

    您可以使用 Get-ADUser 和 -LDAPFilter 参数来获取组成员。它速度很快,支持超过 5000 个条目。

    $groups = @(
        "group1"
        "group2"
        "group3"
    )
    
    Foreach ($group in $groups) {
        Get-ADUser -LDAPFilter "(&(objectCategory=user)(memberof=CN=$group,OU=Groups,OU=rest,DC=of,DC=distinguished,DC=name))" | Export-Csv "C:\$group.csv"
    }
    

    看起来您可以使用此方法构建复杂的过滤器。我需要从一些非常大的组中快速返回启用的成员。我使用的过滤器是:

    "(&(objectCategory=user)(!useraccountcontrol:1.2.840.113556.1.4.803:=2)(memberof=CN=$group,OU=Groups,OU=rest,DC=of,DC=distinguished,DC=name))"

    【讨论】:

    • 如果你想要一些不太复杂的东西/不熟悉 LDAP 过滤器,你可以使用这个:Get-ADUser -Filter "memberof -eq 'CN=$group,OU=Groups,OU=rest,DC=of,DC=distinguished,DC=name'
    • @ferrell_io 我假设您的意思是在结尾处包含一个结束双引号 "?
    • LDAP 过滤器也可用于递归查询组,使用 LDAP_MATCHING_RULE_IN_CHAIN... 这看起来像:“(&(objectCategory=Person)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4. 1941:=))" 在这里找到:confluence.atlassian.com/crowdkb/…
    【解决方案3】:

    我听说这是实际为来自 powershell cmdlet 的请求提供服务的 AD Webservices 的限制。最大大小为 5000。但您可以尝试 dsget 命令,不过您需要获得一点创意。

    $GroupDN = (Get-ADGroup -Identity $Group).DistinguishedName 将为您提供组的 DN。

    像这样使用DSget。

    $members = DSget group $GroupDN -members 这将为您提供所有成员的 DN 列表。

    将其提供给管道中的Get-ADUser cmdlet 或foreach 循环,您就可以开始了。

    【讨论】:

    • 我已经在一组 5600 名用户上进行了测试并且工作正常。也很快。
    • DSget 在我尝试此操作时抛出了“无法识别”错误。我需要转到 Windows 的“程序和功能”并启用 DS Tools。该开关隐藏在 2016 服务器的 Features 选项卡上的“Add Roles...wizard”中。路径是Remote Server Admin Tools/Role Admin Tools/AD DS and AD LDS Tools/AD DS tools。我没有更改任何角色,只是单击直到到达向导的选择功能页面。
    • 对此的快速说明...我尝试过并遇到以下情况: 1)从 dsget 返回的结果在引号中。需要脱衣。 2) 从 dsget 返回的结果无法处理“外来”字符,因此管道到 get-aduser 对这些条目是不可行的。
    【解决方案4】:

    您需要使用 -resultpagesize 参数。您可以指定的最大值是 2147483647。 所以:

    Get-ADGroupMember -Identity $group -resultpagesize 2147483647 |
        Select-Object -Property @{n="Username";e={$_.Name}}, DisplayName,
            @{n="AD Group";e={$group}} |
        Export-Csv C:\Users\Desktop\GroupsInfo.CSV -NoTypeInformation -Append
    

    【讨论】:

    • PS 5.0版本不支持上述参数
    【解决方案5】:

    只需从 ADUC 增加限制 --> 查看 --> 过滤选项 - 每个文件夹显示的最大选项数。

    就是这样。再次尝试运行您的命令。我花了 4 天时间才弄清楚这一点,终于成功了。

    【讨论】:

      【解决方案6】:

      这就是我的做法。我需要从一个安全组中提取超过 25k 台机器。

      $Groups = gc C:\Temp\Groups.txt
      $results = foreach ($Group in $Groups) {
      Get-ADGroup $Group -Properties Member | Select-Object -ExpandProperty Member | Get-ADObject -Properties Name
      }
      $results | Export-csv "C:\Temp\Groups.csv" -NoTypeInformation
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2018-10-13
      • 2019-08-19
      相关资源
      最近更新 更多