PowerShellによるサブスクリプション一括割り当て

ディレクトリ同期ツールを利用して作成されたアカウントは、当初はサブスクリプションが有効になっていない状態で作成されます。つまり、Exchange OnlineやSharePoint Onlineのサービスは利用することができません。

ちなみに、ローカルでDisable状態のまま同期されたアカウントは、サインインが禁止された状態で作成されますので、Microsoft Onlineポータルにもログインできません。

管理者は、このアカウントが利用できるように適切なサブスクリプションを手動で与えなくてはいけません。数は少ない場合は管理者ポータルのユーザ一覧から表示「ライセンス未付与のユーザー」などとして画面で割り当てができますが、導入時や異動の時期など、数十・数百となると現実的ではありません。

簡単にいうと、与えるライセンス名とユーザ名を事前に特定しておいて、

Import-Module MSOnline
$LiveCred = Get-Credential
Connect-MsolService -Credential $LiveCred
Set-MsolUserLicense -userprincipalname test01@example.com -addlicenses test:ENTERPRISEPACK

という形が基本ですが、少し自動化っぽいことをしてみようと思います。

まず、ローカルのActive Directoryで、適当に「これはライセンスを付与するべきユーザ」「まだ未付与である」という情報をアカウントのどこかの属性に付けます。

後のコマンドを見ると少しは分かると思うのですが、ローカルのADと同期先のOffice365でこのフラグを見たり更新したりできるように

[-Country <string>]  国/地域
[-State <string>] 都道府県
[-City <string>] 市区町村
[-Department <string>] 部門
[-Title <string>] 役職

あたりで、出現文字列のパターンの少ない物にするのが良いと思います。

本当は国/地域を使って「日本付与待ち」としようと考えましたが、プルダウンだったのでとりあえずやめました。どうせ一時的だし、内部のメンバーだけ分かっていれば良いのであれば、付与待ち…南極とかでも良いですかね。

付与するライセンスは、とりあえずE3しか持ってないのでENTERPRISEPACKをそのまま割り当てます。特定のAPのフィルタリング(例えばLyncは使わせないとか)についてはまた次の機会に。

この状態で、一度差分同期を取ります。頻繁に実行すると思うので、この辺を参考に適当にリモート実行のショートカットを作っておくと便利だと思います。同期が完了すると、Office365側も東京都付与待ちになります。

そして、PowerShellでOffice365に接続します。Connect-MsolServiceあたりまではいつもの通りで実行します。ちなみに私はパスワード入力とか面倒なのでポータル用とExchange Online用に自動化ログインのショートカット作ってしまってます。

Import-Module ActiveDirectory

$SStatus = $users = $i = $null
$SStatus = Get-MsolAccountSku | where {$_.SkuPartNumber -eq "ENTERPRISEPACK"}
$users = Get-MsolUser -State "東京都付与待ち" -EnabledFilter EnabledOnly -Synchronized -UnlicensedUsersOnly

if ($SStatus -eq $null) {
  Write-Host "error: 適切なライセンスが存在しません"
} elseif ($users -eq $null) {
  Write-Host "error: 該当するユーザが存在しません"
} else {
  ForEach($user in $users) {
    Set-MsolUser -UserPrincipalName $User.UserPrincipalName -UsageLocation JP
    Set-MsolUserLicense -userprincipalname $User.UserPrincipalName -addlicenses $SStatus.AccountSkuid
    Get-ADuser -Filter { UserPrincipalName -eq $User.UserPrincipalName } | Set-ADuser -State "東京都"
    Write-Host "完了: "$User.UserPrincipalName
    $i++
  }
  Write-Host "計 "$i" ユーザにライセンスを付与を完了しました。"
}
  1. Import-Module ActiveDirectory…割り当て終了後、ローカルADの内容を通常の値にする(今回の場合は「東京都」)のに利用します。
  2. Get-MsolAccountSku … 所有しているサブスクリプションのリストを取得し、 ENTERPRISEPACKの物を特定してます。
  3. Get-MsolUser…「市区町村:東京都付与待ち」「サインイン許可」「同期アカウント」「ライセンス未付与」の条件で検索します。
  4. Set-MsolUser…ライセンス割り当ての他に、利用する地域を入力しないとOffice365で利用できないのでJPを設定してます。
  5. Set-MsolUserLicense…ユーザアカウントにENTERPRISEPACKのライセンスを付与しています。
  6. Get-ADuser 、Set-ADuser…UPN名で検索したアカウントを「市区町村:東京都」に設定します。
  7. Write-Host ログの表示と最後に件数を表示

ローカルのADの情報をいじってますので、終了後また差分同期をかけて終了です。とりあえず自分の所で利用する用に1つ手順(ならびにルール)とスクリプトを作っておけば便利に使えると思います。

コメントを残す

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