我正在尝试从文本文件中提取群组,但我的一个群组太大了,有 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
}
Get-ADGroupMember
可以返回的对象数量受到 ADWS(Active Directory Web 服务)中的限制:
MaxGroupOrMemberEntries
5000
指定 Active Directory 模块
、Get-ADGroupMember
和Get-ADPrincipalGroupMembership
cmdlet 可以检索的组成员(递归或非递归)、组成员身份和授权组的最大数量。如果您预计这些 cmdlet 在您的环境中返回超过 5000 个结果,请将此参数设置为更高的值。Get-ADAccountAuthorizationGroup
根据 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[$_] }
我使用 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))"
我听说这是实际为 powershell cmdlet 请求提供服务的 AD Web 服务的限制。最大大小为 5000。但是您可以尝试 dsget 命令,尽管您需要一点创意。
$GroupDN = (Get-ADGroup -Identity $Group).DistinguishedName
将为您提供该组的 DN。
像这样使用
DSget
。
$members = DSget group $GroupDN -members
这将为您提供所有成员的 DN 列表。
将其输入管道或
Get-ADUser
循环中的 foreach
cmdlet,就可以开始了。
您需要使用 -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
我就是这样做的。我需要从安全组中提取超过 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
这将快速为您提供一个群组的所有成员(我的群组有 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};
Get-ADGroupMember 可以返回的对象数量受到 Active Directory Web 服务中的限制。除非配置文件中提供了不同的值,否则限制为 5,000。
因此,如果您尝试获取包含超过 5,000 个对象的组的成员信息,则会违反限制,并且 PowerShell 将发出错误,通知超出了请求的限制。
这篇文章解释了获得相同结果的多种方法。
只需增加 ADUC --> 查看 --> 筛选选项 - 每个文件夹显示的最大选项数的限制。
就是这样。再次尝试运行您的命令。我花了 4 天时间才弄清楚这个问题,终于成功了。