─────────────────────────
─────────────────────────
<概要>
◆ 事前準備
◆ 複数のユーザーに対するライセンスの一括変更
◇ 1. テナント内ライセンス情報の取得
◇ 2. CSV ファイルの出力
◇ 3. CSV ファイルの編集
◇ 4. ライセンスに内包されたサービスの取得
◇ 5. ライセンス オプションの作成
◇ 6. ライセンスの変更
◆ 操作完了後のサインアウト
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Microsoft Graph PowerShell モジュールの導入が完了していない場合は、以下の公開情報をご確認いただき、インストールしていただきますようお願い申し上げます。
<公開情報>
タイトル : Install the Microsoft Graph PowerShell SDK
アドレス : https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation
1-1. Windows PowerShell を管理者として起動し、モジュールの導入のため以下のコマンドレットを実行します。
[コマンドレット]
Install-Module Microsoft.Graph
なお、弊社検証環境および、GitHub の情報より、Microsoft Graph PowerShell モジュールのバージョンにより、ライセンス操作の際にエラーが発生する可能性があることを確認しております。
つきましては、以下の手順にて、モジュールのバージョンのご確認をお願いいたします。
------------------------------------------------------
------------------------------------------------------
以下のコマンドレットを実行し、インストールしたモジュールのバージョンを確認します。
[コマンドレット]
Get-InstalledModule -Name Microsoft.Graph
※ "Version" 列に現在のモジュール バージョンが表示されます。2.28.0 以上であるかをご確認いただきますようお願い申し上げます。
バージョンが異なる場合は以下の手順により、バージョンアップを行っていただきますようお願い申し上げます。
------------------------------------------------------
------------------------------------------------------
以下のコマンドレットを実行し、モジュールのアップデートを実施します。
[コマンドレット]
Update-Module -Name Microsoft.Graph
※ 上記手順を実施後、改めて ◇ 1の手順にてモジュールが、2.28.0 以上になっていることをご確認いただき、以下の手順の実施をお願いいたします。
1-2. 以下のコマンドレットを実行し、サインインとライセンスの管理に必要なアクセス許可への同意を行います。
認証画面がポップアップしますので、管理者アカウントでサインインします。
アクセス許可の同意を求められたら [承諾] をクリックします。
[組織の代理として同意する] はオフのままで問題ありません。
[コマンドレット]
Connect-MgGraph -Scopes "Organization.Read.All","User.ReadWrite.All"
1-3. ユーザーのライセンス操作のため、以下のコマンドレットを実行し、モジュールをインストールします。
[コマンドレット]
Import-Module -Name Microsoft.Graph.Users
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下の手順で、複数のユーザーのライセンスを一括で切り替えることが可能です。
================================
================================
以下のコマンドレットを実行し、テナントに紐づくライセンス情報を確認します。
※ -Wrap 引数は、出力結果を途切れず折り返し表示するためのパラメーターです。
[コマンドレット]
Get-MgSubscribedSku | ft Id, SkuId, SkuPartNumber -Wrap
[出力例]
Id SkuId SkuPartNumber
-- ----- -------------
************************_cdd28e44-67e3-425e-be4c-737fab2899d3 cdd28e44-67e3-425e-be4c-737fab2899d3 O365_BUSINESS
************************_f245ecc8-75af-4f8e-b61f-27d8114de5f3 f245ecc8-75af-4f8e-b61f-27d8114de5f3 O365_BUSINESS_PREMIUM
(以下省略)
[説明]
サービス プランの確認には Id、ライセンスの付与・はく奪の際には SkuId の値を使用します。
そのため、どの SkuId がこれから管理したいライセンスなのかを判別する必要があります。
SkuPartNumber の値から推測できるものもありますが、詳細は以下の公開情報に記載されていますのでそちらをご参照ください。
例えば Microsoft 365 Apps for Business の SkuPartNumber は O365_BUSINESS で SkuId は cdd28e44-67e3-425e-be4c-737fab2899d3 です。
また、Microsoft 365 Business Standard の SkuPartNumber は O365_BUSINESS_PREMIUM で SkuId は f245ecc8-75af-4f8e-b61f-27d8114de5f3 です。
※ SkuPartNumber と SkuId は共通していますが、Id はテナントごとに差異がございます。
<公開情報>
タイトル : ライセンスのための製品名とサービス プラン 識別子
アドレス : https://learn.microsoft.com/ja-jp/entra/identity/users/licensing-service-plan-reference
※ すべてのライセンスを網羅しておりませんが、Microsoft Graph PowerShell 上のライセンスやアプリの名称について案内しています。
================================
================================
----------------
■ A. 特定のライセンスが付与されたユーザーを出力する場合
----------------
【コマンドレット】
$skuId = "<手順 ◇ 1. で確認した、はく奪するライセンスの SkuId>"
$users = Get-MgUser -ALL -Filter "assignedLicenses/any(s:s/skuId eq $skuId)"
$users | select @{n="ObjectId"; e={$_.Id}}, @{n="UserPrincipalName"; e={$_.UserPrincipalName}}, @{n="DisplayName"; e={$_.DisplayName}} | Export-Csv -Encoding UTF8 -NoTypeInformation -Path <ファイル名を含む保存先のパス>
【実行例】
$skuId = "cdd28e44-67e3-425e-be4c-737fab2899d3"
$users = Get-MgUser -ALL -Filter "assignedLicenses/any(s:s/skuId eq $skuId)"
$users | select @{n="ObjectId"; e={$_.Id}}, @{n="UserPrincipalName"; e={$_.UserPrincipalName}}, @{n="DisplayName"; e={$_.DisplayName}} | Export-Csv -Encoding UTF8 -NoTypeInformation -Path C:\temp\APPList.csv
【説明】
・実行例では、Microsoft 365 Apps for Business ライセンスが付与されたユーザーを、C ドライブ直下の temp フォルダーに APPList.csv というファイル名で出力されます。
----------------
■ B. テナント内ユーザーを出力する場合
----------------
【コマンドレット】
Get-MgUser -All |Select DisplayName,UserPrincipalName | Export-Csv "<出力する CSV ファイル名を含むファイル出力先のパス>" -Encoding UTF8 -NoTypeInformation
【実行例】
Get-MgUser -All |Select DisplayName,UserPrincipalName | Export-Csv "C:\temp\AllUserList.csv" -Encoding UTF8 -NoTypeInformation
【説明】
・実行例では C ドライブ直下の temp フォルダーに AllUserList.csv というファイル名で出力されます。
================================
================================
出力した CSV ファイルを Excel などで開き、ライセンスを変更するユーザーを残し、変更しないユーザーは行ごと削除します。
エラー発生などのリスク回避の為、CSV ファイルに残すユーザーは、1 つのファイルに最大で 1,000 アカウント前後までとすることを推奨いたします。
保存先のパスやファイル名は、コマンドレット実行時にデータを呼び出すために必要となります。
1 行目は、コマンドレット実行時に見出しとして利用しますので削除しないようご注意ください。
保存形式は "CSV UTF-8 (コンマ区切り)" をご選択ください。
================================
================================
以下のコマンドレットを実行し、ライセンスに内包されたサービス プランの情報を確認します。
[コマンドレット]
Get-MgSubscribedSku -SubscribedSkuId "<◇ 1. で確認した、サービス プランを確認したいライセンスの Id>" | Select-Object -ExpandProperty ServicePlans | ft ServicePlanId, ServicePlanName
[実行例]
Get-MgSubscribedSku -SubscribedSkuId "************************_f245ecc8-75af-4f8e-b61f-27d8114de5f3" | Select-Object -ExpandProperty ServicePlans | ft ServicePlanId, ServicePlanName
[出力例]
ServicePlanId ServicePlanName
------------- ---------------
39b5c996-467e-4e60-bd62-46066f572726 DYN365BC_MS_INVOICING
dcf9d2f4-772e-4434-b757-77a453cfbc02 MESH_AVATARS_FOR_TEAMS
(以下省略)
[説明]
実行例では、Microsoft 365 Business Standard ライセンス内のサービスを確認しています。
================================
================================
以下のコマンドレットを実行し、ライセンスを付与するためのライセンス オプションを作成します。
※ 上書きになるので、元々無効だったサービス プランを引き続き無効にしたいのであれば DisabledPlans に改めて指定する必要があります。
※ 無効にするサービス プランがない場合は、SkuId (割り当てるライセンスの SkuId) のみ指定します。
[コマンドレット]
$<任意のライセンス オプション名> = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "<◇ 1. で確認した付与するライセンスの SkuId>"; DisabledPlans = @("<◇ 4. で確認した無効にするサービス プランの ServicePlanId>","<◇ 4. で確認した無効にするサービス プランの ServicePlanId>"
※ 無効にするサービス プランが複数ある場合は、コンマで区切り記載します。
[実行例 1] 無効にするサービス プランがある場合
$License1 = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "f245ecc8-75af-4f8e-b61f-27d8114de5f3"; DisabledPlans = @("39b5c996-467e-4e60-bd62-46066f572726")}
[実行例 2] すべてのサービス プランを有効にする場合
$License2 = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "f245ecc8-75af-4f8e-b61f-27d8114de5f3"}
[説明]
実行例 1 では、$License1 で Microsoft 365 Business Standard ライセンス内の、Microsoft Invoicing を無効にしたライセンス オプションを作成しています。
実行例 2 では、Microsoft 365 Business Standard に内包されたサービス プランのすべてを有効するライセンス オプションを作成しております。
================================
================================
以下のコマンドレットを実行し、CSV ファイルに記載されているユーザーのライセンスを一括で変更します。
[コマンドレット]
Import-Csv <ファイル名を含む保存先のパス> | ForEach-Object { Set-MgUserLicense -UserId $_.UserPrincipalName -AddLicenses @(<◇ 5. で作成したライセンス オプション名>) -RemoveLicenses @("<◇ 1. で確認したはく奪するライセンスの SkuId>") }
[実行例]
Import-Csv C:\temp\APPList.csv | ForEach-Object { Set-MgUserLicense -UserId $_.UserPrincipalName -AddLicenses @($License2) -RemoveLicenses @("cdd28e44-67e3-425e-be4c-737fab2899d3") }
[説明]
実行例では、C ドライブ直下の temp フォルダーの APPList.csv ファイルを読みこんでいます。
実行例では、CSV ファイルに記載されたユーザーに対し、Microsoft 365 Apps for Business ライセンスをはく奪し、Microsoft 365 Business Standard ライセンスを付与しています。
※ 無効にするライセンスがない場合は "-RemoveLicenses @()" のように空にします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下のコマンドレットを実行し、 Microsoft Graph からサインアウトします。
[コマンドレット]
Disconnect-MgGraph
<参考情報>
タイトル : Microsoft Graph PowerShell SDK を使用したライセンス管理操作の紹介
アドレス : https://jpazureid.github.io/blog/azure-active-directory/operating-license-with-microsoft-graph/
タイトル : Microsoft Graph PowerShell SDK を使用したライセンス管理操作の紹介 (一括設定編)
アドレス : https://jpazureid.github.io/blog/azure-active-directory/operating-license-with-microsoft-graph2/