PowerShellからOffice365を操作して、メールボックスの利用状況をメールで通知する

PowerShell Advent Calendar 2012 の7 日目の投稿です

すみません!投稿が遅くなりましたm(_ _)m

初心者向け、かつOffice365の手軽さ、安さに釣られて導入してみた兼任なんちゃってシステム管理者むけのライトなエントリーとなります。

Office365はマイクロソフトのクラウドサービスです

  • ExchangeOnline : メールサーバー
  • SharePointOnline :社内ポータルサイト
  • Lync Online : Skype みたいなソフト MSはSkypeを買収したけど別物です
  • Office Professional Plus :ダウンロードインストール可能な いわゆる”Officeソフト” 1ライセンスで5デバイスにインストール可能

の だいたい4つのサービスからなるクラウドサービスです。
これらサービスがだいたい500円~2000円以下/月/人 で利用できるので、中小企業に向いてるサービスです。
そして私が仕事でユーザーにお勧めしているサービスでもあります。

SaaSなので導入してしまうと、それなりに手間がかからないものなのですが、いくつかシステム管理者が手を入れてあげないといけない項目もあります。

PowerShellからOffice365へ接続するための準備

まずはOffice365に対してPowerShellでアクセスできるようにしましょう。

Windows PowerShell を使用して Office 365 を管理する
あたりを参考にして、専用モジュールをダウンロードします。
※モジュールは割と頻繁にアップデートされています!!時々チェックしてください!

そうすると、SPからアクセスすることが出来るようになります。

試しに、ログインするだけのコマンドを実行してみましょう。

$LiveCred = Get-Credential
$LiveCred.Password | ConvertFrom-SecureString | Set-Content C:ScriptsWealthwealth_admin.pass

PS_O365Passport

こんな感じでログイン画面が出てくれば、ちゃんと専用モジュールがインストールされています。
ユーザー名とパスワードはOffice365の管理者メールアドレスとパスワードを入れればOKです。

あとはOffice365用に準備されたコマンドレットを利用してスクリプトを実行することが出来ます。

Office 365 用 Windows PowerShell コマンドレット

各メールボックスの利用状況をHTML化する

例として私が利用している、とあるユーザー向けに実行時点の各ユーザーのメールボックス利用状況を、メールで通知してくれるスクリプトを紹介します。

#Office365 Login
 Import-Module MSOnline
 $password = Get-Content C:Scriptso365_admin.pass | ConvertTo-SecureString
 $LiveCred = New-Object System.Management.Automation.PSCredential "admin@Contoso.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
#FileName Setting
 $yyyymmdd = (Get-Date).ToString("yyyyMMdd")
 $fileNamePath ="C:Scriptso365_subscription.html"
 #Get Office365 Using Status
$hBody = @'
 <style>
 body { background-color:#dddddd;
 font-family:Tahoma;
 font-size:12pt; }
 td, th { border:1px solid black;
 border-collapse:collapse; }
 th { color:white;
 background-color:black; }
 table, tr, td, th { padding: 2px; margin: 0px }
 table { margin-left:50px; }
 </style>
 '@
$hBody += "<h1>Office365 Status for contoso.com</h1>"
 $hBody += 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}} |
 ConvertTo-HTML -Fragment -PreContent "<h2>Office365 契約ライセンス数:</h2>" |
 Out-String
$hBody += Get-Mailbox -ResultSize Unlimited `
 | Get-MailboxStatistics `
 | Select DisplayName,TotalItemSize,ItemCount,LastLogoffTime,StorageLimitStatus `
 | Sort "DisplayName" |
 ConvertTo-HTML -Fragment -PreContent "<h2>ユーザーメールボックスリスト:</h2>" |
 Out-String
ConvertTo-HTML -head $head -PostContent $hBody | Out-File $fileNamePath
#MailSend
 #$mBody =(Get-Date).ToString("yyyy年MM月dd日") + "のOffice365の利用状況をお知らせします`n" + " 各ユーザーのメールボックス利用状況は、添付ファイルを参照してください。"
$smtp = "[SMTP Server]"
 $to = "support@contoso.com"
 $from = "support@contoso.com"
 $subject = "UserName Office365 MailBox監視メール"
 $body =(Get-Date).ToString("yyyy年MM月dd日") + "のOffice365のライセンス契約状況をお知らせします `n"
 $body += "各ユーザーのメールボックス利用状況は、添付ファイルを参照してください。`n`n"
 $body += "Message From ScripsServerName"
#文字のエンコーディング
 $enc = [Text.Encoding]::GetEncoding("csISO2022JP");
 $s64 = [Convert]::ToBase64String($enc.GetBytes($subject), [Base64FormattingOptions]::None)
$mail = New-Object Net.Mail.MailMessage($from, $to)
 $mail.IsBodyHtml = 1
 $mail.Subject = [String]::Format("=?{0}?B?{1}?=", $enc.HeaderName, $s64)
 $view = [Net.Mail.AlternateView]::CreateAlternateViewFromString($body, $enc, [Net.Mime.MediaTypeNames]::Text.Plain)
 $view.TransferEncoding = [Net.Mime.TransferEncoding]::SevenBit
 $mail.AlternateViews.Add($view)
$temp = New-Object System.Net.Mail.Attachment($fileNamePath)
 $mail.Attachments.Add($temp)
$sc = New-Object Net.Mail.SmtpClient($smtp)
 $sc.Send($mail)
 $mail.Dispose()

こんな感じのコードになります。

そして実行結果はこんな風にHTML化されます。

PS_O365HTML

あとはこのスクリプトを、毎日決まった時間に事項実行するようにタスクスケジューラに登録してあげれば、通知が毎日来ますよん

次回のPowerShell Advent Calendar 2012 は@mayuki さんです

Comments are Disabled