Office365を管理しているとユーザーの作成・削除は日々行うものであり、従業員の出入りの多い企業においては自動化の仕組みを作っていることもあるかと思います。
ライセンスの付与の自動化については主にPowerShellからAzure ADへ接続し、 Set-MsolUserLicense や Set-AzureADUserLicense コマンドを実行する例がよく取り上げられています。
先日MicrosoftのTech Communityに既存のライセンス管理手法の廃止と新しいGraph APIベースでのライセンス管理手法が発表されました。
既存のライセンス管理手法は2022/6/30で廃止するとの記載があるため、それまでにスクリプトなどの入れ替えを行う必要があります。
Microsoft Graph APIを用いた新しいライセンス管理手法でのライセンスの付与・削除方法を確認しましたので記載します。
※2021/08/30追記
テナントに登録されているライセンス一覧とサービス情報の取得について追記
Microsoft Graph PowerShell モジュールのインストール
まず、Microsoft Graphへ接続するためのPowerShellモジュールを取得します。
管理者権限でPowerShellを実行し、以下のコマンドでインストールを実施します。
Install-Module -Name Microsoft.Graph
PowerShell Galleryからインストールが実施されます。
2021/8/27 時点では1.6.1が最新でした。
Microsoft Graphへの接続とリソースへのアクセス許可
モジュールがインストールされたら以下コマンドを実行し、Azure ADの管理者アカウントでログインを実施します。
Connect-MgGraph -TenantID <Azure AD Tenant ID> -Scopes "User.ReadWrite.All"
TenantIDは入力しなくてもログインアカウントで自動的にAzure ADテナントを選択してくれますが、一つの端末で複数のAzure ADテナントへログインしたい場合は指定が必要です。
接続の際にはScopesオプションでリソースにアクセスする範囲と権限を指定する必要があります。
ここで指定しないリソースへはコマンドの実行が拒否されるため、必要であれば Disconnect-MgGraph で切断してから再度適切なScopesを用いて接続をする必要があります。
また、初回はScopesで指定した権限について以下のようにOAuthでの委任のアクセス許可が表示されます。
操作を実施するためには許可する必要がありますが、不必要な権限を付与すると危険なため、管理に必要な最小限のリソースのみをScopesで指定するようにしましょう。
ユーザーライセンスの管理に必要なスコープは User.ReadWrite.All のみです。


ライセンスの付与
Azure ADテナントへ接続したら以下のようにコマンドを実行することでライセンスの付与が可能です。
無効化したいサービスがある場合は、ServicePlanId を配列として DisabledPlans に追加してあげることで指定サービスを無効化した状態でのライセンス付与も可能です。
(Sway, Yammer, Bookingsあたりが槍玉にあげられがち)
また、ライセンスが既に付与済みのユーザーに対して一部サービスの有効・無効を変えたい場合も DisabledPlans を適切に設定して上書き実行が可能です。
$license = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense
# ↓下記は Microsoft365 E5 Developer License
$license.SkuId = c42b9cae-ea4f-4ab7-9717-81576235ccac
# Sway, Yammer Enterprise, Bookings を無効化
$disable = @("a23b959c-7ce8-4e57-9140-b90eb88a9e97","7547a3fe-08ee-4ccb-b430-5077c5041653","199a5c09-e0ca-4e37-8f7c-b05d533e1ea2")
$license.DisabledPlans = $disable
Set-MgUserLicense -UserId <UserPrincipalName> -AddLicenses $license -RemoveLicenses @()
なお、特に削除ライセンスがない場合でも RemoveLicenses オプションは必須です。
ライセンスを削除しない場合は空の配列として @() を渡してあげます。
ライセンスの削除
ライセンスを削除する際には無効化サービスの指定やカスタムオブジェクトを生成せずに直接ライセンスのSkuIdを指定するだけでライセンスが削除できます。
こちらも追加時と同様、追加ライセンスがない場合でも AddLicenses オプションが必須なので気を付けましょう。
Set-MgUserLicense -UserId <UserPrincipalName> -AddLicenses @() -RemoveLicenses c42b9cae-ea4f-4ab7-9717-81576235ccac
ライセンス処理の自動化
上記までで管理者アカウントとしてAzure ADに接続し、ユーザーライセンスを付与する手法を説明しました。
しかし、実際の自動化においてMFAもなしにID/パスワードのみで管理者アカウントの認証を行うことは大変危険です。
証明書を用いた無人でのログイン方法が用意されているため、実際の自動化の仕組みにおいてはそちらを利用してAzure ADへ接続しライセンスの処理を実施しましょう。
Connect-MgGraph -TenantID <TenantID> -AppID <ApplicationID> -CertificateThumbnailPrint <CertificateThumbprint>
証明書の生成やAzure Automationでの実行については Exchange Onlineへの証明書認証 とほぼ同じですので、そちらをご参照ください。
まとめ
Microsoft Graph PowerShell モジュールを利用することで問題なくライセンスの付与を実施できることを確認しました。
2022/6/30までに既存の自動化処理を見直し、適切な仕組みへ入れ替えを行いましょう。
ちなみに私がコマンドを漁った限りではテナントに登録されているライセンスリストの確認コマンドがわかりませんでした。
記載の SkuId や ServicePlanId についてはすでにライセンス付与済みのユーザーに対して Get-MgUserLicenseDetail を用いて確認しています。
※2021/8/30追記
@micachi_net さんにテナントに登録されているライセンスの取得は「Get-MgSubscribedSku」だよと教えてもらいました。
こちらのコマンドは “Directory.Read.All” の権限で実行できることを確認しています。