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

Powershell Get-ADGroupMember:超出了此请求的大小限制,powershell,active-directory,Powershell,Active Directory,我正试图从文本文件中提取组,但我的一个组太大,有80000人 我怎样才能让它工作呢?我,它输出我想要的结果 $groups = Get-Content c:\temp\ADGroups.txt foreach($group in $groups) { @(Get-ADGroup $group -Properties Member| Select-Object -ExpandProperty Member).Count Get-ADGroupMember -Identity $g

我正试图从文本文件中提取组,但我的一个组太大,有80000人

我怎样才能让它工作呢?我,它输出我想要的结果

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

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

MaxGroupOrMemberEntries

五千

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

根据,您应该能够通过查询组对象并扩展其
成员
属性来解决此问题(如果您不能增加服务的限制):

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

$users = @{}
Get-ADUser -Filter '*' -Property Name, DisplayName | ForEach-Object {
    $users[$_.DistinguishedName] = $_
}
以便您可以按其专有名称查找:

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

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


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

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

像这样使用
DSget

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


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

我使用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=distributed,DC=name))”

我已经在5600名用户中测试了这一点,并取得了成功。我尝试此操作时,DSget抛出了一个“无法识别”错误。我需要转到Windows“程序和功能”并启用DS工具。该开关隐藏在功能选项卡上的2016服务器“添加角色…向导”中。路径是
远程服务器管理工具/角色管理工具/AD DS和AD LDS工具/AD DS工具
。我没有更改任何角色,只是在到达向导的“选择功能”页面之前单击。关于此的快速说明。。。我尝试了一下,遇到了以下问题:1)从dsget返回的结果包含在引号中。我需要脱掉衣服。2) 从dsget返回的结果无法处理“外来”字符,因此通过管道获取aduser是不允许的。提到的参数不适用于PS 5.0版注意:此处隐藏了一个gotcha。如果使用用户的主要组(通常为
域用户
),则该用户不会列在组的
成员
属性中&该组不会显示在用户的
成员
属性中。相反,您必须查询用户的
PrimaryGroupId
property(请参阅了解更多信息)。注意:这种方法没有这个问题。@Ansgar-您使用$users哈希表的解决方案很酷,但是如何防止在目录庞大的情况下内存阻塞?(某些组包含>15000个成员)和>100K的用户对象。如果您想要不太复杂的东西/不熟悉LDAP筛选器,您可以使用以下内容:
Get ADUser-Filter“memberof-eq'CN=$group,OU=groups,OU=rest,DC=of,DC=distributed,DC=name”
@ferrell\u io我假设您打算包含一个双引号
最后,还可以使用LDAP筛选器使用LDAP\u匹配\u链中的\u规则\u递归查询组。。。如下所示:(&(objectCategory=Person)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=):
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
$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"
}