Get-ADGroupMember:此请求的大小限制已超过。

15

我正在尝试从文本文件中提取组,其中一个组太大了,有80,000人。

我该如何让它工作,并按照我想要的方式输出?

$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
}
7个回答

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

MaxGroupOrMemberEntries

5000

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

根据此帖子,如果无法增加服务上的限制,则可以通过查询组对象并展开其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”属性(请参见https://www.reddit.com/r/PowerShell/comments/8ivat1/getaduser_memberof_not_displaying_primary_group/了解更多信息) - JohnLBevan
1
注意:DSGroup方法没有这个问题。 - JohnLBevan
@Ansgar - 你使用 $users 哈希表的解决方案非常酷,但是如何防止内存堆积在巨大目录的情况下发生?(有些组包含> 15000个成员和大于100K的用户对象。) - Karthick Ganesan

12

我使用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' - scrthq
@ferrell_io 我猜你应该在末尾加一个双引号",对吧? - TylerH
同时,LDAP过滤器可以使用LDAP_MATCHING_RULE_IN_CHAIN递归查询组...它看起来像这样:"(&(objectCategory=Person)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=<yourgroupDNhere>))"。在这里找到:https://confluence.atlassian.com/crowdkb/active-directory-user-filter-does-not-search-nested-groups-715130424.html - dragonspeed
假设所有成员都来自同一个域,这在许多公司并非如此。而且,它只列出了一级成员。如果您有嵌套组,您将无法获得所有成员的完整画面。 - undefined
同一领域是暗示需要在用户上下文中运行吗?支持递归-请参见您上面的评论。我刚刚测试了一下,它可以运行,但速度会慢一些,这是可以预料的。更多信息请参考:https://learn.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax#operators -请查看'LDAP_MATCHING_RULE_IN_CHAIN' - undefined

5
我听说这是AD Webservices的限制,它实际上是为powershell命令提供服务的。最大尺寸是5000。但您可以尝试使用dsget命令,虽然您需要做一些创意。 $GroupDN = (Get-ADGroup -Identity $Group).DistinguishedName将给您该组的DN。
像这样使用DSget$members = DSget group $GroupDN -members 这将给您所有成员的DN列表。
将其提供给管道中的Get-ADUser cmdlet或使用foreach循环,您就可以开始了。

1
我已经在5600个用户组上进行了测试,并且运行良好。速度也相当快。 - Sid
3
当我尝试这个操作时,DSget出现了“未被识别”的错误。我需要进入Windows的“程序和功能”中启用DS工具。此开关在2016服务器“添加角色...向导”的“功能”选项卡中。路径为“远程服务器管理工具/角色管理工具/AD DS和AD LDS工具/AD DS工具”。我没有更改任何角色,只是一路点击,直到达到向导的“选择功能”页面。 - Michael
1
关于这个问题的快速说明...我尝试了一下,遇到了以下问题: 1)dsget返回的结果带有引号。需要去掉。 2)dsget返回的结果无法处理“外国”字符,因此在这些条目上使用管道符号获取-aduser是不可行的。 - dragonspeed

1
您需要使用 -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

7
PS版本5.0中没有提到的参数。 - Matthias Güntert
如果有的话,应该是-ResultSetSize,但是虽然Get-ADUserGet-ADComputer等命令中定义了这些参数,但是对于Get-ADGroupMember来说,根据链接的文档来看,它们是 没有 定义的。 - undefined

1
这是我处理的方法。我需要从一个安全组中提取超过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

您的答案可以通过添加更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便其他人可以确认您的答案是否正确。您可以在帮助中心找到有关撰写良好答案的更多信息。 - Community

0

这将快速地给您提供一个组的所有成员(我的组有85k个成员)

$groupMembers = Get-ADGroup -Identity $group -Server $domainGroupIsIn -Properties Member | Select-Object -ExpandProperty Member ;

或者如果您需要过滤一些内容 $whereMatch = $recipient.DistinguishedName.Remove(0, $index); # 限制到一个域或容器

$groupMembers = Get-ADGroup -Identity $group -Server $domainGroupIsIn -Properties Member | Select-Object -ExpandProperty Member | Where {$_ -match $whereMatch};

-1

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

就是这样。再次运行您的命令。我花了4天时间才弄清楚这一点,最终它正在工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接