対象: 新Office365 Office 365 Enterprise, Office 365 Small Business, Office 365 Midsize Business
(この記事は 2014 年 8 月 6 日に Hey, Scripting Guy! Blog に投稿された記事 Use PowerShell for Office 365 Reportingの翻訳です。最新情報については、翻訳元の記事をご参照ください。)
概要: Windows PowerShell を使用して Office 365 レポート Web サービスを照会する方法について説明します。
Scripting Guy さん、こんにちは。Office 365 管理ページには、さまざまなボタンから数多くのレポートを利用できますが、しかしコマンドレットでレポートを利用している人はあまり多くないようです。Windows PowerShell を使用して、レポートの作成を自動化したり、レポートの結果をカスタマイズしたりする方法はありませんか?
—GB
こんにちは、GB さん。
Microsoft Scripting Guy こと Ed Wilson です。今朝、Zune でアリス クーパーでも聴こうかという気分の中、朝食にベーグルと 1 杯のコーヒーをとりました。Teresa がペルー産のオーガニック コーヒー豆を手に入れたんです。以前リマで Windows PowerShell のクラスを受け持っていたときから、私はすっかりペルー コーヒーのファンです。リマは魅力的な街で、一緒に仕事をした仲間も優秀な人たちばかりでした。ある日の午後にリマで撮った写真を載せておきます。
音楽、音楽プレーヤー、そして朝食と、今日はなんだかオールド スクール尽くしの 1 日になりそうです。
そうそう、オールド スクールと言えば…
Office 365 レポート Web サービスを使用する
Office 365 に関する情報のソースは、Office 365 レポート Web サービスから利用可能です。このサービスの説明と関連情報は、MSDN の「Office 365 レポート Web サービス」でご覧いただけます。Office 365 Web サービスは、開発者やカスタム レポートを作成する皆様を主な対象としています。レポートはすべて、管理ポータルで利用可能です。Windows PowerShell コマンドレットからアクセスできるレポートは、レポート Web サービス経由でアクセスできます。この Web サービスの使い方はとても簡単なので、Hey, Scripting Guy! ブログをご愛読いただいている皆様には朝飯前でしょう。
Office 365 レポート Web サービスで苦労するポイントとなるのが Invoke-RestMethodを呼び出す一環として渡されるクエリ文字列の作成ですが、スクリプト センターのリポジトリ「Office 365 レポート Web サービスに PowerShell からアクセスする (英語)」で Alan Byrne が作成したスクリプトを見たとき、クエリ文字列を簡単に作成する方法を思いつきました。Alan は Hey, Scripting Guy! ブログに何度か寄稿 (英語)してくれているので、遠慮せずコードを拝借したいと思います。
もちろん、コードは手を加える必要があるので、Alan から拝借したコードを次のように修正します。
$Root = "https://reports.office365.com/ecp/reportingwebservice/reporting.svc/"
$Format = "`$format=JSON"
$WebService = "ConnectionbyClientTypeYearly"
$Select = "`$select=Date,ClientType,TenantName,Count"
# Build report URL
$url = ($Root + $WebService + "/?" + $Select + "&" + $Format)
使用するレポートに応じて、コードを 2 か所変更しました。$WebService変数には Office 365 レポート Web サービスの記事から取得した名前が格納されます。たとえば、このスクリプトでは ConnectionbyClientTypeYearlyレポートを照会します。MSDN によれば、このレポートには次のフィールドがあります。
- ClientType
- Count
- Date
- TenantGuid
- TenantName
利用可能なフィールドの一覧を参考に、$Select変数を次のように修正します。
$Select = "`$select=Date,ClientType,TenantName,Count"
ConnectionbyClientType*には、次の 4 種類のレポートがあります。
- ConnectionbyClientTypeDaily
- ConnectionbyClientTypeWeekly
- ConnectionbyClientTypeMonthly
- ConnectionbyClientTypeYearly
メモ他にも ConnectionbyClientTypeDetail*という一連のレポートがあります。私は当初混同してしまったので、皆様もお気を付けください。これらのレポートは、指定できるフィールドが異なります。
いつものように保管されている資格情報を使用することにします。そのために XML ファイルから資格情報を読み取ります。次のようになります。
$cred = Import-Clixml C:\fso\ScriptingGuyCredential.xml
PowerShell はとっても便利
Windows PowerShell を知っている方は、PowerShell の万能性をよくご理解いただいていることでしょう。Invoke-RestMethodから取得した結果を Foreach-Objectコマンドレットにパイプ処理して、カスタム オブジェクトを作成します。カスタム オブジェクトの作成には Windows PowerShell 3.0 構文を使用します (この方法と、この方法を用いる理由については Hey, Scripting Guy! ブログの「PowerShell オブジェクトのレッスン: パート 3 (英語)」で取り上げました)。
カスタムの Windows PowerShell オブジェクトを作成して使用すると、何でも好きなことができるというメリットがあります。カスタム オブジェクトは次のようなスクリプトで作成します。
(Invoke-RestMethod -Credential $cred -uri $url).d.results |
Foreach-Object {
[PSCustomObject] @{
Date = $_.date.tostring("yyyy-MM-dd")
WindowsLiveID = $_.WindowsLiveID
UserName = $_.UserName
ClientType = $_.ClientType
Count = $_.Count } }
さあ、このスクリプトでどんな処理をしましょうか。たとえば、返されたオブジェクトを Out-Gridviewにパイプ処理することができます。次のように、Count=$_.Countに続く 2 つの閉じ括弧の後にコードを追加します。
Count = $_.Count } } | Out-GridView
テキスト ファイルに書き込むときに出力をきれいな表に整えるには、すべての変数に値を代入したスクリプトの冒頭にテキスト ファイルのパスを追加し、Count = Count スクリプトの後に Format-Tableコマンドレットを追加します。次のようになります。
$OutputFile = "c:\fso\connecttype.txt"
<# … #>
Count = $_.Count } } |
Format-Table | Out-File -FilePath $OutputFile -Encoding ascii
CSV ファイルへの書き込みには Export-CSVを使用します。次のようになります。
Count = $_.Count } } | Export-Csv -Path $OutputFile
このように、レポートからオブジェクトを作成したら、後は自由に利用できます。スクリプト全文 (修正なし) は次のとおりです。
$cred = Import-Clixml C:\fso\ScriptingGuyCredential.xml
$Root = "https://reports.office365.com/ecp/reportingwebservice/reporting.svc/"
$Format = "`$format=JSON"
$WebService = "ConnectionbyClientTypeYearly"
$Select = "`$select=Date,ClientType,TenantName,Count"
# Build report URL
$url = ($Root + $WebService + "/?" + $Select + "&" + $Format)
(Invoke-RestMethod -Credential $cred -uri $url).d.results |
Foreach-Object {
[PSCustomObject] @{
Date = $_.date.tostring("yyyy-MM-dd")
WindowsLiveID = $_.WindowsLiveID
UserName = $_.UserName
ClientType = $_.ClientType
Count = $_.Count } }
GB さん、Windows PowerShell を使用して Office 365 レポート Web サービスを照会する方法については以上です。引き続き Office 365 Week として、明日も便利な情報をお届けします。
Twitter (英語)や Facebook (英語)でも情報を発信していますので、ぜひフォローをお願いします。ご不明な点がございましたら、私のアドレス (scripter@microsoft.com) 宛てに電子メールをお送りいただくか、公式の Scripting Guys フォーラム (英語)に投稿してください。それではまた明日お会いしましょう。
Microsoft Scripting Guy こと Ed Wilson