くらめその情シス:【小ネタ】Office365のプランをスクリプトで切替えたおはなし

2021.10.13

どうも、情シスやってますアノテーションの徳道です。

弊社もご多分に漏れずMicrosoft Officeを使っている方が多いのですが(社員全員ではありません~)、先日Office365の年間ライセンスの更新がありました。

これまでは社員が増えるたびに都度購入のためにオープンライセンスのものを購入していたのですが、CSP(Cloud Solution Provider)ライセンスへと切り替えることになりました。

Open License の購買チャネルをクラウド ソリューション プロバイダー プログラムに移行

この時にOffice365管理画面でユーザーの付け替えが発生したので、それをPowerShellスクリプトで実行した、という小ネタです。

なお、最初からオチを書いてしまいますと「Azureのグループでライセンス割り当て変更すればいいじゃん」となります。。。

まぁ今回PowerShellスクリプトで直接ライセンスの割り当てを変更することもできますよ、ということで。

オープンライセンス→CSPライセンスで割当ユーザーが引き継がれない

今回、Office365のライセンス更新に際し、CSPの購入手続きでは「更新」ではなく「新規購入」となりました。

つまり、同じ製品であってもライセンスとしては別物になるわけです。

ライセンスが納品されると Office365のラインセスが2つ。。。

サブスクリプションの購入チャネルを見ると

上のものは「コマーシャルダイレクト」

下のものは「リセラー」となります。

ここが違うので別物になっちゃうわけですね。

で、もちろん新規購入ライセンスの割り当てはゼロ。こちらで割り当てをし直さないといけません。

Powershellで一括更新してみよう

今現在割当をされているユーザーはライセンス一覧で「ユーザーのエクスポート」でユーザープリンシパルネーム:UPNが分かります。

さて、これを新しいライセンスに割り当てていくのですが、300近くのユーザーを手で割り当てるのはめんどくさすぎます。

そこでPowershellでライセンスの追加ができますよ、とCSPの営業さんからのアドバイスもあり、簡単なPowerShellを組んでみました。

【公式】PowerShell を使用して Microsoft 365 に接続する - Microsoft 365 Enterprise

まずはAzureへの接続と割当先ライセンスの情報収集

スクリプトでライセンス追加出来ることはわかりました。

まずはAzureに接続しないといけませんね。まずAzureADモジュールを最初にインストールしておきます。

Install-Module AzureAD

インストールできたら、Connect-AzureADコマンドでテナントにサインインしましょう。

Connect-AzureAD

Account              Environment TenantId                             TenantDomain                AccountType
-------              ----------- --------                             ------------                -----------
cm-admin@classmethod.jp AzureCloud  xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx3fd1 classmethod.onmicrosoft.com User

Connect-AzureADコマンドレットでAzureADのサインインダイアログが表示されますので、「Office アプリ管理者」ロールを持つアカウントでログインします。

PowerShellのウィンドウを開く都度実行しておく必要があります。

では目的のライセンスがどれなのか。。。Get-AzureADSubscribedSku というコマンドレットで情報が取れそうです

Get-AzureADSubscribedSku | Select SkuPartNumber

SkuPartNumber
-------------
EMSPREMIUM
FLOW_PER_USER_DEPT
FLOW_PER_USER
MDATP_XPLAT
WINDOWS_STORE
ENTERPRISEPACK
FLOW_FREE
POWER_BI_STANDARD
TEAMS_EXPLORATORY
EMS
O365_BUSINESS_ESSENTIALS
SMB_BUSINESS
O365_BUSINESS

 

おおう…わかりにくい。

O365_BUSINESS_ESSENTIALS、O365_BUSINESS

どうもこの2つのどちらかそう?既にオープンライセンス版のOffice365を持ってるユーザーを調べればどっちか、というのはわかりそうです。

以下のスクリプトで調べてみましょう。

$userUPN="class.metaro@classmethod.jp"
$licensePlanList = Get-AzureADSubscribedSku
$userList = Get-AzureADUser -ObjectID $userUPN | Select -ExpandProperty AssignedLicenses | Select SkuID
$userList | ForEach { $sku=$_.SkuId ; $licensePlanList | ForEach { If ( $sku -eq $_.ObjectId.substring($_.ObjectId.length - 36, 36) ) { Write-Host $_.SkuPartNumber } } }

SMB_BUSINESS
EMS
TEAMS_EXPLORATORY

おおおお・・・O365じゃないんですね。。。 AzureADのユーザーライセンスと見比べると…どうもSMB_BUSINESS がオープンライセンス(コマーシャルダイレクト)版のOffice365(Microsoft 365 Apps for business)だったようです。 では、この逆にこのユーザーにCSPライセンス(リセラー)版を割り当てて、再度Powershellで見てみましょう。

$userUPN="class.metaro@classmethod.jp"
$licensePlanList = Get-AzureADSubscribedSku
$userList = Get-AzureADUser -ObjectID $userUPN | Select -ExpandProperty AssignedLicenses | Select SkuID
$userList | ForEach { $sku=$_.SkuId ; $licensePlanList | ForEach { If ( $sku -eq $_.ObjectId.substring($_.ObjectId.length - 36, 36) ) { Write-Host $_.SkuPartNumber } } }

SMB_BUSINESS
EMS
TEAMS_EXPLORATORY
O365_BUSINESS ← 追加された

スクリプトでのライセンスの割り当て指定先はこれで確定しました。

どのライセンスが割当先かはっきりしない場合、このようにGUIで特定ユーザーに一時的に割り当てを行ってその結果をPowershellで取得・差分を取れば、どのラインセンス名か特定することができます。

割当スクリプトで一括登録

それではスクリプトで更新していきましょう。

公開されている基本スクリプトはこれです。

$planName="SubScription"
$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$License.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $planName -EQ).SkuID
$LicensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$LicensesToAssign.AddLicenses = $License
$userUPN="hogehoge@hogehoge.com"
Set-AzureADUserLicense -ObjectId $userUPN -AssignedLicenses $LicensesToAssign

$planName 変数と$userUPN 変数を指定すればいいわけですね。

で、これでは1回づつユーザーやラインセスを指定しないといけないので、CSVファイルでリストを読み込ませて一括設定する簡単なPowershellスクリプトを作成してみました。

#MicrosoftライセンスをCSVファイル読み込んで一括追加

#引数指定
#Args[0]:ユーザー、付与ライセンスのCSVファイル名
#CSVファイルの書式
#ヘッダー行:UPN,LICENSE
#データ行:ユーザープリンシパル名,ライセンス名

$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense

$UsersList=Import-Csv $Args[0]

$UsersList | ForEach-Object {
    $UserUPN=$_.UPN
    $PlanName=$_.LICENSE

    Write-Output $PlanName"を "$UserUPN" に付与します"

    $License.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $PlanName -EQ).SkuID
    $LicensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
    $LicensesToAssign.AddLicenses = $License

    Set-AzureADUserLicense -ObjectId $UserUPN -AssignedLicenses $LicensesToAssign

}

exit

CSVファイルは

ユーザープリンシパルネーム(UPN),ライセンス名

の書式で作成します(必ずヘッダー行を指定してください)。

UPNは弊社ではメールアドレスとしています。ご利用のAzureテナントのUPNをご確認ください。

UPN,LICENSE
class.metaro@classmethod.jp,O365_BUSINESS
class.mesoko@classmethod.jp,O365_BUSINESS

これを実行すれば一括でユーザーごとに指定のライセンスを付与できます。

割当スクリプトで一括削除

逆に削除する場合、PowerShell Microsoft 365アカウントからユーザー ライセンスを削除する を参考に、以下のスクリプトで削除を行います。

$userUPN="hogehoge@hogehoge.com"
$planName="SubScription"
$license = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$License.RemoveLicenses = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $planName -EQ).SkuID
Set-AzureADUserLicense -ObjectId $userUPN -AssignedLicenses $license

こちらもCSVから読み出しで一括変更するPoweshellを置いておきますね。

#MicrosoftライセンスをCSVファイル読み込んで一括削除

#引数指定
#Args[0]:ユーザー、付与ライセンスのCSVファイル名
#CSVファイルの書式
#ヘッダー行:UPN,LICENSE
#データ行:ユーザープリンシパル名,ライセンス名

$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses

$UsersList=Import-Csv $Args[0]

$UsersList | ForEach-Object {
    $UserUPN=$_.UPN
    $PlanName=$_.LICENSE

    Write-Output $PlanName"を "$UserUPN" から削除します"

    $License.RemoveLicenses = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $planName -EQ).SkuID 
    Set-AzureADUserLicense -ObjectId $UserUPN -AssignedLicenses $License

}

exit

これで何百ユーザーの指定でもOK!

さいごに

今回はMicrosoft 365管理センターのライセンス付与をPowershellでやってみました。

冒頭で書いたとおり通常はグループを活用してライセンスの割り当てを行っていればいいのかな、と思います。

とはいえ、AzureADのユーザー、グループ管理の権限を持たないライセンス管理者の方がスクリプトを用いてちょっと楽にライセンス付与をするためにこんな方法もありますよ、というTipsでした。

どこかでどなたかのお役に立てれば幸いです。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。 「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。 現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイト をご覧ください。