MSOnline PowershellモジュールのSet-MsolUserLicenseコマンドレットが非推奨になった。
使用することは未だ可能だが、スクリプトなどで連続処理を行なうと、3~4件ぐらい処理した後に、下記のエラーが発生して、次の処理を行えるまでにかなりの時間(分のオーダー)が掛かり実用的ではない。
You have exceeded the maximum number of allowable transactions. Please try again later
仕方が無いので、Microsoft Graph APIを使用した方法を試してみた。
ただ、面倒なのはライセンスを追加するにしろ削除するにしろ、Microsoft Graph APIと同じ形で、追加,削除双方のパラメータが必須なところ。
一々、手で打ち込むのは大変なので、下記のようなfunctionを作成してみた。
# MS Graphを使用してライセンスの付与
# skunameはEXCHANGESTANDARDやENTERPRISEPACK等
function global:AddLicense($user,$skuname) {
# 追加するサブスクリプションライセンスのSkuId(GUID)を取得
$local:sku = get-mgsubscribedsku -all | where-object {$_.SkuPartNumber -eq $skuname}
$lic = @(
@{
SkuId = $sku.SkuId
DisabledPlans = @()
}
)
# UserIDを取得
$local:uid = get-mguser -userid $user
# ライセンス付与(-RemoveLicensesパラメータも必須-空のリストを渡す)
set-mguserlicense -userid $uid.Id -addlicenses $lic -removelicenses @()
}
# MS Graphを使用してライセンス削除
# skunameはEXCHANGESTANDARDやENTERPRISEPACK等
function global:RemoveLicense($user,$skuname) {
# 削除するサブスクリプションライセンスのSkuId(GUID)を取得
$local:sku = get-mgsubscribedsku -all | where-object {$_.SkuPartNumber -eq $skuname}
# UserIDを取得
$local:uid = get-mguser -userid $user
# ライセンス削除(-AddLicensesパラメータも必須-空のリストを渡す)
set-mguserlicense -userid $uid.Id -AddLicenses @() -RemoveLicenses @($sku.SkuId)
}
ちなみに、Microsoft Graph Powershell Moduleのコマンドレットを使用する前には、Connect-MgGraphコマンドを実行しておく必要がある。
Connect-MgGraphコマンドには、-Scopesパラメータで、User.Read.All,User.ReadWrite.All,Directory.Read.All,Directory.ReadWrite.All等、コマンド実行に必要な権限を指定する必要がある。
実際に試してみて、単体では問題無く処理ができた。また、連続処理も(同じアカウントにだが)追加,削除をfor文で10回繰り返してもエラーが出なかったので、多分、問題は無いと思う。