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

时间:2017-09-06 15:14:57

标签: powershell active-directory

我正在尝试从文本文件中删除组,而我的一个组太大,有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
}

4 个答案:

答案 0 :(得分:8)

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

  

MaxGroupOrMemberEntries

     

5000

     

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

根据this thread,您应该可以通过查询组对象并扩展其Get-ADAccountAuthorizationGroup属性(如果您无法增加服务限制)来解决此问题:

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

答案 1 :(得分:2)

我听说这是AD Web服务的限制,它实际上为来自powershell cmdlet的请求提供服务。最大大小为5000.但您可以尝试使用dsget命令,尽管您需要获得一些创意。

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

像这样使用DSget

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

将其反馈到管道或Get-ADUser循环中的foreach cmdlet,您就可以了。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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