読者です 読者をやめる 読者になる 読者になる

なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

PowerShellで「Office365」からグループとメンバーのデータを引っこ抜くまで

メーリングリストとそのメンバーの一覧をExcelで寄越せ

「GAL(Global Address List)=アドレス帳見ろよカス」と言えない情シス。


かといって、ダイレクトにCSV等に落とす方法はないので、1件1件見ながらExcelの台帳に更新するのも馬鹿馬鹿しい。



で、調べてたらPowerShell使えばデータ抜くくらいはできるよ、ってことだったので、実際にやってみたことを記録しておきます。


なお、PowerShell、初めて使います。
コマンドレットってまたキモい単語だなーってところからでしたけど、まあやってみればなんとかなる。


一応、PowerShell自体はインストールされて起動されているところからね。

ガイドブックを入手

先々いろいろお世話になるので、意味もわからず実行すれば取れるスクリプトを使うんじゃなくて、ちゃんと理解しようねってはなし。


以下URLで、「Microsoft Office 365 PowerShell ガイド(Word/PDF)」を入手!
Download Microsoft Office 365 PowerShell ガイド from Official Microsoft Download Center

(以下、「ガイド」とし、これに沿って進める。


PowerShell自体が初めての場合、「ガイド」にしたがって
Windows PowerShell ユーザー ガイド」を参照する。


プログラムの経験ないしUNIX/LINUXのコマンドを叩いたことがある人であれば、該当セクションは10分くらいで読み流せる。
Windows PowerShell ユーザー ガイド



実行環境の準備

ガイドを読み進め
「1.2PowerShell 実行環境の準備」に入る。


まずはOffice365へアクセス。


「1.2.1Office 365用PowerShellモジュールのインストール」
に進むと、

Windows PowerShell を使用して Office 365 を管理する」
の短縮アドレスが書いてあるので、これに飛ぶ
http://aka.ms/aadposh
と、以下にリダイレクトされる
Windows PowerShell による Azure AD の管理」
Manage Azure AD using Windows PowerShell



このサイトを読み進めていくと、
「Azure AD モジュールのインストール 」があるので、コレに従い2つインストールする。


Microsoft Online Services Sign-In Assistant for IT Professionals RTW」
Download IT プロフェッショナル 用 Microsoft Online Services サインイン アシスタント RTW from Official Microsoft Download Center



「Azure Active Directory Module for Windows PowerShell (64 ビット バージョン)」
(リンク踏むとダウンロード始まる)
http://go.microsoft.com/fwlink/p/?linkid=236297



念のため、モジュールバージョンも確認
PowerShell

(get-item C:\Windows\System32\WindowsPowerShell\v1.0\Modules\MSOnline\Microsoft.Online.Administration.Automation.PSModule.dll).VersionInfo.FileVersion

を実行。(一行で。最初のカッコも含めてコピペ。)


バージョン番号が 1.0.8070.2 より小さい場合は、新しいものを入れなおす必要があるらしいですが、そこは省略。

「Azure AD へ接続」へ読み進めていき、コマンドレットモジュールを取り込む。

import-module MSOnline

準備としてはここまで。

Office365に接続

Office365≒MSOnlineにつなぐにはOffice365の認証をする必要があるので、以下コマンドを実行。

$msolcred=get-credential

ユーザー認証画面がでるので、Office365のメールアドレスとパスワードを入力する。

で、さらに接続コマンドを発行する。

connect-msolservice -credential $msolcred

ここまで進むと、他のコマンドが使えるようになる模様。



次に、Office365につながってコマンドが機能するか確認するために、ユーザーリストを取得するコマンドを叩いてみる。

Get-MsolUser

これでユーザーリストがだーっと帰ってくれば、ここまでの設定はOK.


この勢いで、グループリストとグループメンバーリストもやってみよう。Exchangeへのエイリアス設定は、Office365のグループ:配布リストと同期してるし、とれてしまうならそれでよし。

「グループ一覧」を取得する

グループのリスト取得はコレ。

Get-MsolGroup
https://technet.microsoft.com/ja-jp/library/dn194130.aspx

デフォルトで250件までの表示なので、いろいろ出てきそうな場合は絞り込みを。


今回の場合はメーリングリスト=配布リストなので、配布リスト以外のグループを使っている場合は絞り込むために

 -GroupType DistributionList

を付けてあげると良い。


で、デフォ出力だとメールアドレスが出力されないし、表示名も切れてしまうので、

Get-MsolGroup -GroupType DistributionList | format-table -Property objectId,DisplayName,EmailAddress

の後ろに

 -autosize
(可能な限り全表示、ただし切られることもあるので、PowerShell自体のプロパティ>レイアウト>画面のバッファーサイズ、で横のサイズを増やしておくとよい)

または、

 -wrap
(折り返してすべて表示)

にすると、見た感じは綺麗になります。


「グループメンバーのリスト」を取得する

グループメンバーのリスト取得はコレ。

Get-MsolGroupMember
https://technet.microsoft.com/ja-jp/library/dn194085.aspx

これで、1グループずつ、メンバーリストが取得できるが、-GroupObjectId は、前述の「Get-MsolGroup」の結果で出される意味不明の文字列であって、配布リスト=グループの名称じゃないので要注意。

CSVに保存する

Office365からの取得の話をちょっと離れて、単純にCSV出力の話を先に。

この記事が参考になりました。
GUIユーザーのためのPowerShell入門 (11) CSVファイルを加工する | マイナビニュース

Export-Csv  保存ファイル名 -Encoding  文字コード

これを、他のコマンドの後ろにパイプでつないであげると、CSVファイルとして指定した場所に保存されます。
なお、Export-Csvはepcsvっていう短縮名称エイリアスを持っているので、主にそちらを使います。


なお、そのまま使うと

  • 文字コードの問題で、-EncodingオプションをなしにするとASCIIが指定されて日本語が文字化けする。でも、オプション「-Encoding default」って書くとShift JISになるっていう謎仕様。
  • PowerShell画面上での見やすさを重視して表示整形(format-table)などすると、むしろうまく出力できない。
  • 出力したカラムヘッダ行の上に、オブジェクトのタイプを示す行が含まれていて、そのままデータベース等に取り込むのに邪魔になる。

という問題があります。


なので、今回の場合は、

グループリスト
 Get-MsolGroup -GroupType DistributionList | epcsv C:\temp\MsolGroup.csv -Encoding default -NoTypeInformation

グループメンバーリスト
 Get-MsolGroupMember メンバーリストを取得したいグループのObjectId l epcsv c:¥temp¥groupXXXX.csv -Encoding default -NoTypeInformation

って書くと、キレイなCSVが取れます。


ここまでやれば、あとは煮るなり焼くなりして見せたい形のExcelに加工していくだけです。



今後について

せっかくかじったPowerShellだし、今の職場にいる以上、WindowsServerから逃れることはできないようなので、もう少しいじってみたいですね。


  • Exchange側へつないで取得

実はExchange側にちゃんとつなげれば、リスト出力できるスクリプトがころがってる。
http://community.office365.com/ja-jp/f/333/t/216759.aspx

「リモート PowerShell を使用して Exchange に接続する」
http://technet.microsoft.com/ja-jp/library/jj984289(v=exchg.150).aspx


  • PowerShellで連続した処理を使い、Office365なりExchangeなりからぶっこ抜いたグループとメンバーの括取得からの見せたい形への加工までを書いてみる

人は易きに流れてコピペの繰り返しやら、苦手なテキスト処理よりDB(てかAccess)にぶっこんでリレーションで処理したり。
そうじゃねえだろと。

  • ActiveDirectory管理全般

むしろ台帳(Excel)なり申請データからADにぶっこみに行くくらいの。


について、もっと調べていく予定。


Windows PowerShell 実践システム管理ガイド2版 (TechNet ITプロシリーズ)

Windows PowerShell 実践システム管理ガイド2版 (TechNet ITプロシリーズ)