テキストファイルからグループを取得しようとしていますが、グループの1つが大きすぎて、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 Services)の制限によって制限されます:
MaxGroupOrMemberEntries
5000
Active Directoryモジュールで取得できるグループメンバー(再帰的または非再帰的)、グループメンバーシップ、および承認グループの最大数を指定します
Get-ADGroupMember
、Get-ADPrincipalGroupMembership
、Get-ADAccountAuthorizationGroup
コマンドレット。これらのコマンドレットがご使用の環境で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[$_] }
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コマンドレットからのリクエストを実際に処理するAD Webサービスの制限であると聞いています。最大サイズは5000です。少しクリエイティブを取得する必要がありますが、dsgetコマンドを試すことができます。
$GroupDN = (Get-ADGroup -Identity $Group).DistinguishedName
は、グループのDNを提供します。
DSget
をこのように使用します。
$members = DSget group $GroupDN -members
これにより、すべてのメンバーのDNのリストが表示されます。
それをGet-ADUser
コマンドレットをパイプまたはforeach
ループで実行すると、問題ありません。