Powershell Get-ADGroupMember:超出了此请求的大小限制
我正试图从文本文件中提取组,但我的一个组太大,有80000人 我怎样才能让它工作呢?我,它输出我想要的结果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
$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"
}