※この投稿は PowerShell Advent Calender に参加しています。
Office 365は、ポータルとExchange OnlineについてPowerShellで接続して操作を行なうことができます。
今回は、スクリプトを利用してOffice365の管理者が定期的に実行する作業を自動化して、朝コーヒー飲む時間分くらいは節約できるようにしてみたいと思います。
まずは、タスクから自動で実行して接続するために、認証情報をファイルに保存します。
(以下、admin@example.onmicrosoft.com を管理者アカウントとして想定)
$LiveCred = Get-Credential
$LiveCred.Password | ConvertFrom-SecureString | Set-Content $Env:Windiradmin_example.pass
今回はテスト用にWin直下に放り込んでますが、常用する際はちゃんとアクセス権を設定して保護して下さい(一応暗号化はされてますが)。
まずは、パスワードファイルからパスワードを読み込み、Office365管理ポータルとExchange Onlineに接続します。普段の作業用には、ここまでのショートカット作っておくと楽です。
Import-Module MSOnline
$password = Get-Content $Env:Windiradmin_example.pass | ConvertTo-SecureString
$LiveCred = New-Object System.Management.Automation.PSCredential "admin@example.onmicrosoft.com",$password
Connect-MsolService -Credential $LiveCred
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection
Import-PSSession $Session
まずはOffice365管理ポータルから、サブスクリプションの利用状況を取得します。作成すべきアウトプットによって出力先は変えればいいかと思いますが、まずはcsvファイルに日付付きで出力してみようと思います。
Get-MsolAccountSku | select @{name="名前";exp={$_.SkuPartNumber `
-replace "DESKLESSPACK","Office365 プランK1" `
-replace "DESKLESSWOFFPACK","Office365 プランK2" `
-replace "LITEPACK","Office365 プランP1" `
-replace "STANDARDPACK","Office365 プランE1" `
-replace "STANDARDWOFFPACK","Office365 プランE2" `
-replace "ENTERPRISEPACK","Office365 プランE3" `
-replace "ENTERPRISEWITHSCAL","Office365 プランE4" `
-replace "EXCHANGEENTERPRISE","Exchange プラン2" `
-replace "EXCHANGEDESKLESS","Exchange KIOSK" `
}},`
@{name="有効";exp={$_.activeUnits}},`
@{name="期限切れ";exp={$_.SuspendedUnits}},`
@{name="割り当て済み";exp={$_.ConsumedUnits}} `
| Export-Csv -Encoding UTF8 -NoTypeInformation $env:tmpo365_subscription_$(Get-Date -Format "yyyyMMdd").csv
SkuPartNumberにそれぞれプランに対応する文字列が入っているのですが、ちょっとまだ判明していないプランが有るので分かる範囲で。
続いては、Exchange Onlineに接続してメールボックスの利用状況を見てみたいと思います。オンラインヘルプの Windows PowerShell を使用してメールボックス サイズとメールボックス クォータを表示する 辺りに詳しいサンプルがありますので、こちらを参考にします。(ただ、私の環境だとサイズの計算のところで上手く値の変換とかしてくれなくて動かなかったので、サンプルは末尾のように一部変更する必要がありました。)
まず、後からExcelで加工できるように、一度csvファイルに出力します。
Get-Mailbox -ResultSize Unlimited `
| ? {$_.RecipientTypeDetails -eq "UserMailbox"} `
| Get-MailboxStatistics `
| Export-Csv -Encoding UTF8 -NoTypeInformation $env:tmpo365_mailboxstat_$(Get-Date -Format "yyyyMMdd").csv
本当はこの時点でsortとかできると良いのですが、Office365で出力した物が、Exchange2010とかと違ってToMBとかの変換が利かないようなので、文字列を数値に変換してからソートしてます。
Import-CSV $env:tmpo365_mailboxstat_$(Get-Date -Format "yyyyMMdd").csv `
| select DisplayName,ItemCount,@{name="MailboxSize";exp={$_.TotalItemSize.Split("(")[1].Split(")")[0].Split(" ")[0].Replace(",","")}} `
| sort {[int] $_.MailboxSize} -descending `
| select DisplayName,@{name="Alias";exp={(Get-Mailbox $_.DisplayName).Alias}},@{name="Mail";exp={(Get-Mailbox $_.DisplayName).PrimarySmtpAddress}},ItemCount,MailboxSize `
| Export-Csv -Encoding UTF8 -NoTypeInformation $env:tmpo365_mailusage_$(Get-Date -Format "yyyyMMdd").csv
とりあえず、こんな感じの物を office365_daily.ps1 として保存しておきます。そして、これをタスクスケジューラーに登録します。「ユーザーがログオンしているかどうかにかかわらず実行する」「最上位の特権で実行する」を選択します。
操作では、直接ps1ファイルを指定するとメモ帳がバックグラウンドで立ち上がって終わりという悲しい事態になるので、プログラム「C:WindowsSystem32WindowsPowerShellv1.0powershell.exe」引数の追加「-Command <先ほど作成したps1ファイル>」
で、トリガーで「毎日4:02に起動」とか設定しておくと、デイリーのレポートを自動的に生成してくれます。
本当はWebページに接続して、ポータルからメンテナンス予定や故障発生レポート、FOPEから前日のトラフィックレポートなどを自動取得したり、結果をメールで送信したりするのも作りたかったのですが、認証系が少し面倒そうなので今回は軽めの所からやってみました。
【参考】オンラインヘルプのサンプルの要修正場所
すべてのメールボックスのサイズとクォータの状態を表示する
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select DisplayName,StorageLimitStatus,@{name="TotalItemSize (MB)";expression={[math]::Round(($_.TotalItemSize.Value.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},@{name="TotalDeletedItemSize (MB)";expression={[math]::Round(($_.TotalDeletedItemSize.Value.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},ItemCount,DeletedItemCount | Sort "TotalItemSize (MB)" -Descending | Export-CSV "C:My DocumentsAll Mailboxes.csv" -NoTypeInformation
メールボックス クォータを超過したメールボックスのみを表示する
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | where {$_.StorageLimitStatus.ToString() -ne "BelowLimit"} | Select DisplayName,StorageLimitStatus,@{name="TotalItemSize (MB)";expression={[math]::Round(($_.TotalItemSize.Value.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},@{name="TotalDeletedItemSize (MB)";expression={[math]::Round(($_.TotalDeletedItemSize.Value.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},ItemCount,DeletedItemCount | Sort "TotalItemSize (MB)" -Descending | Export-CSV "C:My DocumentsExceeded Quotas.csv" -NoTypeInformation