くらめその情シス:【小ネタ】Office365のプランをスクリプトで切替えたおはなし
どうも、情シスやってますアノテーションの徳道です。
弊社もご多分に漏れず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 ------- ----------- -------- ------------ ----------- [email protected] 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="[email protected]" $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="[email protected]" $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="[email protected]" 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 [email protected],O365_BUSINESS [email protected],O365_BUSINESS
これを実行すれば一括でユーザーごとに指定のライセンスを付与できます。
割当スクリプトで一括削除
逆に削除する場合、PowerShell Microsoft 365アカウントからユーザー ライセンスを削除する を参考に、以下のスクリプトで削除を行います。
$userUPN="[email protected]" $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サイト をご覧ください。