ディレクトリ同期の運用自動化

この記事は、Office 365 Advent Calendarに参加しています。

AD FSやディレクトリ同期を利用すると、オンプレミスのADとOffice365の間でシームレスな運用が可能になります。ただ、

  • 同期間隔が3時間
  • 同期後のサブスクリプションの割り当てが管理者が実行しなくてはならない

など、いくつか運用として管理者が対処を行わなければならない部分が存在します。

今回はディレクトリ同期で新規で作成されたユーザーに対してOffice365のプロビジョニング(サブスクリプションの割り当て)を自動で実施できるようにしたいと思います。特に社内でIdMなどを利用している場合などについては有用だと思います。

同期ユーザーの中でどのユーザーにライセンスを割り当てるかの判定は、各組織によって色々と実装方式は有ると思いますが、今回WAAD Premium のグループ管理機能と同じようにグループで判断したいと思います。

まずは、以下の内容のps1スクリプトファイルを作成して適当なフォルダに配置します。管理者のID、PassやSKU(Get-MsolAccountSkuコマンドで取得可能)、グループ名などは実際の環境に合わせて修正してください。今回はc:workscriptsautodirsync.ps1として保存します。

######################################################################
#
#    Office 365 Auto Provisioning Script for DirSync (autodirsync.ps1)
#       2013/12/11     https://blog.o365mvp.com/
#
######################################################################
$adminuser = "admin@contoso.onmicrosoft.com"     # TenantAdmin UserName
$adminpass = "P@ssw0rd"                          # TenantAdmin Passrord
$group = "Office365e3"                           # Target Group
$sku = "contoso:ENTERPRISEPACK"                  # Office365 SKU ID (cf.Get-MsolAccountSku)
$skuname = "E3"                                  # Office365 SKU name
$log = "c:workscriptsautodirsync.log"         # Log Filename

(Get-Date -Format "yyyy/MM/dd HH:mm:ss") + " Office 365 Auto Provisioning Script Start" | Out-File $log -Append

sleep 60                  # Wait for reflect DirSync information

Import-Module MSOnline
$password = ConvertTo-SecureString $adminpass -AsPlainText -Force
$LiveCred = New-Object System.Management.Automation.PSCredential $adminuser,$password
Connect-MsolService -Credential $LiveCred

$member = Get-MsolGroupMember -GroupObjectId (Get-MsolGroup -SearchString $group).ObjectId -All
$unlicensed = Get-MsolUser -UnlicensedUsersOnly
foreach ( $user in $unlicensed ){
    $result = $member | ? {$_.ObjectID -eq $user.ObjectID}
    if ($result) {
        (Get-Date -Format "yyyy/MM/dd HH:mm:ss") + " Add $skuname License to " + $user.UserPrincipalName | Out-File $log -Append
        Set-MsolUser -UserPrincipalName $user.UserPrincipalName -UsageLocation JP
        Set-MsolUserLicense -UserPrincipalName $user.UserPrincipalName -AddLicenses $sku
    }
}
(Get-Date -Format "yyyy/MM/dd HH:mm:ss") + " Office 365 Auto Provisioning Script Finished" | Out-File $log -Append

このスクリプトをディレクトリ同期が終了したタイミングで実行すれば良いので、今回はタスクのトリガーで実行したいと思います。バージョンにより異なりますが、サーバのイベントログを確認して、Directory Syncronizationサービスの4か114のExport完了のイベントログを特定します。
20131210_01 20131210_02

続いてはタスクスケジューラへの登録です。右の操作ペインから基本タスクの作成を選択してウィザードを起動します。
20131210_03

名前は適当に付けて、トリガーを「特定イベントのログへの記録時」にして、ソースやイベントIDは前の項目で特定したエクスポート完了時のイベントログを指定します。
20131210_04
20131210_05 20131210_06

実施するアクションはプログラムの開始にします。.ps1のスクリプトファイルをタスクから起動する場合は、プログラム/スクリプトの項目には c:windowssystem32WindowsPowerShellv1.0powershell.exe を、引数として -command [.ps1スクリプトのフルパス]を指定します。
 20131210_08 20131210_09 20131210_10

最後に、作成したタスクのプロパティを開いて、[ユーザーがログオンしているかどうかにかかわらず実行する]を選択して実行アカウントのパスワードを保存します。
20131210_11

これにより、デイレクトリ同期完了後、指定のグループ(上記ではOffice365e3)のメンバーでライセンスの割り当てられていないユーザーが存在した場合には自動的にライセンスが割り当てられるようになります。
20131210_12

実際の運用の中では、環境に応じてsleepの値を調整したりUsageLocationにJP以外が有ったり複数のサブスクリプションがある場合はその処理部分などを修正すれば良いかと思います。ライセンスの残数を見て閾値を下回ったら自動的にメールを飛ばすなども入れておくと楽になりますね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です