トップ回答者
配布グループ一覧を取得する

質問
-
Power Shell入門者です。
Exchangeで設定した配布グループ一覧を作成したいです。
現在は以下の通り、1グループごとに取得し最後にファイルをまとめています。
全部で50くらいのグループですが、まとめて取得する方法を教えてください。Get-DistributionGroupMember "M9999" | Select-object Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\GroupMemberM9999.csv
最終的に欲しいデータは
1.配布グループ表示名
2.メンバーシップ
です。
よろしくお願いします。
回答
-
こんにちは。胡田です。
手元に環境がありましたので、試してみました。結果、以下のようにすることで動作しました。
$distributionGroups = Get-DistributionGroup -ResultSize Unlimited foreach($distributionGroup in $distributionGroups) { $g = $distributionGroup.DisplayName Get-DistributionGroupMember $g -ResultSize Unlimited | Select-Object @{Label="GroupName"; Expression={$g}}, Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\tmp\GroupMember$g.csv }
もともと出ていたエラーは以下です。
パイプラインは既に実行中のため、パイプラインは実行されませんでした。複数のパイプラインは同時に実行できません。
+ CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) []、P
SInvalidOperationException
+ FullyQualifiedErrorId : RemotePipelineExecutionFailedどうやら、Get-DistirubutionGroupを実行している最中に、さらにGEt-DistributionGroupMemberを呼び出していたのが原因のようです。なので、一度結果を変数に入れ、再度ループを回してあげるようにしたら動きました。ついでに結果が多数だと1000件までしか取得できないので、-ResultSize Unlimitedを追加しておきました。
参考になれば幸いです。
- 回答としてマーク musako 2012年12月20日 2:13
すべての返信
-
Get-DistributionGroupMemberコマンドレットはヘルプによるとグループの複数指定はできない感じですね。
ForEach-Objectコマンドレットを使って、列挙処理をしてやると良いのではないでしょうか。
まとめて一つのファイルに出力する場合:
"g1","g2","g3" | foreach {Get-DistributionGroupMember $_} | Select-object Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\GroupMember.csv
グループごとにファイルを分けて出力する場合:
"g1","g2","g3" | foreach {Get-DistributionGroupMember $_ | Select-object Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\GroupMember$_.csv}
-
今ちょっとExchange Serverの検証環境がないのでドキュメントで分かる範囲でのご回答になりますが、Get-DistributionGroupMemberコマンドレットでは配布グループに所属のメンバーを取得することはできますが、配布グループの情報そのものは取れないような気がします。
配布グループ自体の情報を取得するにはGet-DistributionGroupコマンドレットが使えそうです。両コマンドレットを併用する必要があるのではないでしょうか。
ご提示のスクリプトでは最終的にCSVファイルで結果を出力していますが、出力フォーマットはどのようなものを想定しておられますか?
DisplayName,Alias
group1,gr1
groupmember1,gm1
groupmember2,gm2
group2,gr2
groupmember1,gm1
...のように、グループとメンバー両方をフラットにまとめるのか、グループとメンバー一覧をそれぞれ別ファイルにするのかでコードがだいぶ変わってきそうです。
-
牟田口大介様
>グループとメンバー両方をフラットにまとめるのか、グループとメンバー一覧をそれぞれ別ファイルにするのかでコードがだいぶ変わってきそうです。
前者、両方フラットにまとめるです。
現在以下の流れにてデータを作成しています。
【A】配布グループの一覧を取得
DisplayNameにはユニークの番号をつけています。Get-DistributionGroup | Export-Csv -Encoding UTF8 C:\Group_$(Get-Date -Format "yyyyMMdd").csv
【B】配布グループそれぞれのグループのメンバーを取得
ファイル名に【A】で取得したDisplayName(9999)をそれぞれつけています。Get-DistributionGroupMember "9999" | Select-object Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\GroupMember9999.csv
Department /DisplayName /PrimarySmtpAddress /Title
【B】のデータが揃ったら、それぞれのグループメンバーのリストに【A】DisplayName(ファイル名から確認)を付け、最終的に一つのファイルにまとめています。
↓ の形になります。【B】のデータに配布グループ名(表示名)が追加されればOKなのですが…
配布グループ名/Department /DisplayName /PrimarySmtpAddress /Title
-
それであれば、流れとしてはこのような感じになるかと思います。
Get-DistributionGroup | foreach { $g = $_.DisplayName Get-DistributionGroupMember $g | Select-Object @{Label="GroupName"; Expression={$g}}, Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\GroupMember$g.csv }
基本は前のスクリプトと同じですが、出力CSVに配布グループ名のカラムを追加したいので、Select-ObjectコマンドレットでGroupNameというプロパティを追加しています。
-
こんにちは。胡田です。
手元に環境がありましたので、試してみました。結果、以下のようにすることで動作しました。
$distributionGroups = Get-DistributionGroup -ResultSize Unlimited foreach($distributionGroup in $distributionGroups) { $g = $distributionGroup.DisplayName Get-DistributionGroupMember $g -ResultSize Unlimited | Select-Object @{Label="GroupName"; Expression={$g}}, Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\tmp\GroupMember$g.csv }
もともと出ていたエラーは以下です。
パイプラインは既に実行中のため、パイプラインは実行されませんでした。複数のパイプラインは同時に実行できません。
+ CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) []、P
SInvalidOperationException
+ FullyQualifiedErrorId : RemotePipelineExecutionFailedどうやら、Get-DistirubutionGroupを実行している最中に、さらにGEt-DistributionGroupMemberを呼び出していたのが原因のようです。なので、一度結果を変数に入れ、再度ループを回してあげるようにしたら動きました。ついでに結果が多数だと1000件までしか取得できないので、-ResultSize Unlimitedを追加しておきました。
参考になれば幸いです。
- 回答としてマーク musako 2012年12月20日 2:13