none
配布グループ一覧を取得する RRS feed

  • 質問

  • Power Shell入門者です。

    Exchangeで設定した配布グループ一覧を作成したいです。

    現在は以下の通り、1グループごとに取得し最後にファイルをまとめています。
    全部で50くらいのグループですが、まとめて取得する方法を教えてください。

     

    Get-DistributionGroupMember "M9999" | Select-object Department, DisplayName, PrimarySmtpAddress, Title | Export-Csv -Encoding UTF8 C:\GroupMemberM9999.csv

    最終的に欲しいデータは

    1.配布グループ表示名

    2.メンバーシップ

    です。

    よろしくお願いします。

    2012年12月6日 1:24

回答

  • こんにちは。胡田です。

    手元に環境がありましたので、試してみました。結果、以下のようにすることで動作しました。

    $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
    2012年12月14日 4:10

すべての返信

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

    2012年12月6日 4:48
    モデレータ
  • 牟田口大介様

    回答ありがとうございます。

    希望一歩手前のものが取れました。

    配布グループの全般にある表示名、エイリアスを一緒に取得したいのですが、

    Alias,  DisplayName とすると、各メンバーの情報が取得されてしまいます。

    全般にある情報を取得するには?

    2012年12月6日 5:28
  • 今ちょっとExchange Serverの検証環境がないのでドキュメントで分かる範囲でのご回答になりますが、Get-DistributionGroupMemberコマンドレットでは配布グループに所属のメンバーを取得することはできますが、配布グループの情報そのものは取れないような気がします。

    配布グループ自体の情報を取得するにはGet-DistributionGroupコマンドレットが使えそうです。両コマンドレットを併用する必要があるのではないでしょうか。

    ご提示のスクリプトでは最終的にCSVファイルで結果を出力していますが、出力フォーマットはどのようなものを想定しておられますか?

    DisplayName,Alias
    group1,gr1
    groupmember1,gm1
    groupmember2,gm2
    group2,gr2
    groupmember1,gm1
    ...

    のように、グループとメンバー両方をフラットにまとめるのか、グループとメンバー一覧をそれぞれ別ファイルにするのかでコードがだいぶ変わってきそうです。

    2012年12月6日 6:09
    モデレータ
  • 牟田口大介様

     >グループとメンバー両方をフラットにまとめるのか、グループとメンバー一覧をそれぞれ別ファイルにするのかでコードがだいぶ変わってきそうです。

    前者、両方フラットにまとめるです。

    現在以下の流れにてデータを作成しています。

    【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

    2012年12月6日 7:06
  • それであれば、流れとしてはこのような感じになるかと思います。

    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というプロパティを追加しています。

    2012年12月6日 7:56
    モデレータ
  • PowerShell入門者でして…未開発者です。

    このまま貼り付けると 「パイプラインは既に実行中のため」と出るのですが。

    何か違う方法があるのでしょうか?

    2012年12月6日 8:15
  • 提示したコードはコンソールに直で貼りつけても、ps1ファイルとして保存して実行してもOKです。

    コードとしてはおそらく間違いはないと思うのですが、なにぶん実行環境がないもので動作確認ができず、すみません。

    2012年12月6日 8:47
    モデレータ
  • こんばんは、

    当方も環境がないため全くの勘ですが、Exchange用?のコマンドレットに括弧をつけたらどうなりますかね?

    (Get-DistributionGroup) とか

    (Get-DistributionGroupMember $g) とか・・・

    見当違いだったらごめんなさい。

    2012年12月6日 10:04
  • ps1ファイルについて調べ確認してみます。

    本日は忙しいので週明けにでも…まずはお礼まで

    2012年12月7日 0:54
  • おはようございます。

    PowerShell入門者でして…未開発者です。

    ということもあり、見当違いがわからないほどです。

    知識をつけ参考とさせていただきます。

    投稿ありがとうございました!

    2012年12月7日 0:56
  • 少し時間が経ってしまいましたが、昨日ps1ファイルを作成し実行しましたが、2行くらい赤い文字がみえ、取得することができませんでした。

    入門者であり、未開発者ですので、何かしていまうのは怖く、原因究明はしていません。

    Powershellとうまく繋がり、ps1ファイルの作成については問題ないかとおもわれます。

    最初に回答いただいた方法にてあとは手作業にて処理をしていきたいと思います。

    またお時間あるときにわかりましたら回答いただければ幸いです。

    2012年12月12日 0:46
  • こんにちは。胡田です。

    手元に環境がありましたので、試してみました。結果、以下のようにすることで動作しました。

    $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
    2012年12月14日 4:10
  • 胡田さま

    ありがとうございました。

    無事取得し作業を大幅に軽減することができそうです。

    入門者として甘えましたが、これを気に知識をつけていきます。

    大変助かりました!

    2012年12月20日 2:13