Get-ADGroupMember:超出了此请求的大小限制

问题描述 投票:0回答:8

我正在尝试从文本文件中提取群组,但我的一个群组太大了,有 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
}
powershell active-directory
8个回答
24
投票

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[$_] }

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))"


5
投票

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

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

像这样使用

DSget

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

将其输入管道或

Get-ADUser
循环中的
foreach
cmdlet,就可以开始了。


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

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

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};

0
投票

Get-ADGroupMember 可以返回的对象数量受到 Active Directory Web 服务中的限制。除非配置文件中提供了不同的值,否则限制为 5,000。

因此,如果您尝试获取包含超过 5,000 个对象的组的成员信息,则会违反限制,并且 PowerShell 将发出错误,通知超出了请求的限制。

这篇文章解释了获得相同结果的多种方法。


-1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.