SEくぼたの事件簿

インフラSEとしての活動を記録していきます

Microsoft365のライセンス付与 アプリのオンオフをPowerShellで実施する方法(MS Graph編)

こんばんは!

 

ブログを書くネタに困りしばらく停止してましたが、昔記載した以下の記事を修正しないといけなくなったため改めて記載します。

kbtblog.hatenablog.com

思えば1年以上前、一番最初に書いたブログでした!1年以上続いたことに自分でびっくり!笑

 

上記記事ではMicrosoft365のユーザーのライセンス割り当てをPowershellで実施する方法を紹介していました。

その際、MSOnlineというPowerShellモジュールをインストールして実行していたのですが、MSOnlineで利用されるADAL(Azure Active Directory Authentication Library)をMSAL(Microsoft Authentication Library)とMicrosoft Graph APIを利用するように変更してくださいという案内がでました!

↓の記事ですね!

Microsoft Authentication Library と Microsoft Graph への移行は完了済みでしょうか? | Japan Azure Identity Support Blog (jpazureid.github.io)

記事内では

2022 年 6 月 30 日をもちまして Active Directory Auth Library (ADAL) および Azure Active Directory Graph のサポートを終了するため、MSAL および Microsoft Graph を使用するよう、アプリのアップデートを推奨します。また、まだ ADAL を使用しているアプリを簡単に見つけることができるようにいたしました。

と書かれているので、記事をアップデートします。

なおこれによって、PowerShellのAzureADモジュールおよびMSOnlineのコマンドレットに影響が発生します。

 

実施したい内容は上記記事と同じで以下を目指します。

  1. PowerShellを利用してMicrosoft365ユーザーのライセンス割り当てを実施
  2. 特定のアプリケーションはオフ

 

  • モジュールのインストール方法

Powershellを管理者として起動して

「Install-Module Microsoft.Graph」を実行

f:id:KKubo19:20210909213203p:plain

表示される選択肢はYとAで実行

f:id:KKubo19:20210909213341p:plain

サポートされる条件は以下

細かくはここを確認

Microsoft Graph PowerShell SDK をインストールする - Microsoft Graph | Microsoft Docs

 

Powershellにて「Connect-Graph -Scopes Directory.ReadWrite.All」

f:id:KKubo19:20210909214744p:plain

※ちなみにScopesにはDirectory.ReadWrite.Allと結構大きな権限を付けてつないでいます。

呼び出したいものによって必要な委任の権限が違うので、確認されたい方はリファレンスを確認してください。

Microsoft Graph の概要 - Microsoft Graph | Microsoft Docs

こんな感じで書かれると思うので、利用するものをピックアップください。

f:id:KKubo19:20210909214257p:plain

ちなみに今回のライセンス割り当てに必要なアクセス権限は以下のどちらかです。

  • User.ReadWrite.All
  • Directory.ReadWrite.All

 

接続に利用するアカウントを選択もしくは入力

f:id:KKubo19:20210909214113p:plain

 

組織の代理として同意するにチェックをいれ承諾をクリック

f:id:KKubo19:20210909214358p:plain

 

接続されたことが確認できます。

f:id:KKubo19:20210909214424p:plain

試しに「Get-MgUser」を実行してみるとユーザーリストが取得できることがわかります。※塗りつぶし過ぎてよくわからないですね・・・笑

f:id:KKubo19:20210909214534p:plain

 

  • ライセンス割り当ての準備

ライセンス割り当てをPowershellで実行するにあたり以下の準備を実施します。

  1. 割り当てるライセンスのID確認
  2. ライセンスをオフにするアプリケーションのID確認

 

1.割り当てるライセンスのID確認

Micrsoft Graphに接続されたPowerShellコンソールで「Get-MgSubscribedSku | fl」を実行

f:id:KKubo19:20210909215210p:plain

今回はMicrosoft365 E5 DEVELOPERを付与しようと思うので上記の赤丸のSkuIdとIdを確認します。

 

2.ライセンスをオフにするアプリケーションのID確認

Micrsoft Graphに接続されたPowerShellコンソールで以下を実行

 

(Get-MgSubscribedSku -SubscribedSkuId 7bf3acff-2346-4dfa-9c69-6f23129f36ba_c42b9cae-ea4f-4ab7-9717-81576235ccac | Select-Object serviceplans).serviceplans 

-SubscribedSkuIdの後ろには対象のライセンスのIdを入力します。

SKUIDじゃないよ!注意!

f:id:KKubo19:20210909220215p:plain

これでライセンスに含まれるServicePlanNameとIDが確認できます。

今回は赤線で記載したTeamsとFormsをオフにしてみます。

対象のアプリケーションのIDを控えます。

 

  • いざライセンス付与

初回ライセンス付与の場合、前回の記事と同様に利用ロケーションを設定しないとライセンス付与がエラーになります。

今回pstest@xxx.mlというユーザーにライセンス付与するので、まずは利用ロケーションを設定します。※日本の想定で記載しています。

下記を実行

「Update-MgUser -UserId pstest@xxx.ml -UsageLocation "JP"」

f:id:KKubo19:20210909220535p:plain

次にライセンス情報を保有するオブジェクトを作成します。

ここで、先ほど調査したSkuIdとServicePlanIdを利用します。

下記を実行

$AddLicense = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "c42b9cae-ea4f-4ab7-9717-81576235ccac"; disabledPlans =@("57ff2da0-773e-42df-b2af-ffb7a2317929","e212cbc7-0961-4c40-9825-01117710dcb1")}

f:id:KKubo19:20210909220734p:plain

SkuIdとdisabledPlans内の文字列は先ほど調査した値に合わせて変更してください。

ちなみにアプリケーションは全部オンでいいよって場合はこっち

$AddLicense = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "c42b9cae-ea4f-4ab7-9717-81576235ccac"}

f:id:KKubo19:20210909221039p:plain

以下を実行

Set-MgUserLicense -UserId pstest@msdive.ml -AddLicenses @($AddLicense) -RemoveLicenses @()

f:id:KKubo19:20210909221238p:plain

管理画面から参照してみると

f:id:KKubo19:20210909221408p:plain

f:id:KKubo19:20210909221422p:plain

ちゃんと設定されていることが確認できました!!

 

  • おまけ

前回と同様に単一ユーザーへの設定のため複数ユーザーへの適用処理についても記載します。

内容はほぼ前回と一緒なので細かい解説は省きます。

Connect-Graph -Scopes Directory.ReadWrite.All
$File = "C:\temp\List.csv"
$UserLists = Import-Csv -Path $File

$AddLicense = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense `
-Property @{SkuId = "c42b9cae-ea4f-4ab7-9717-81576235ccac"; disabledPlans =@("57ff2da0-773e-42df-b2af-ffb7a2317929","e212cbc7-0961-4c40-9825-01117710dcb1")}

foreach($User in $UserLists){
  Update-MgUser -UserId $User.User -UsageLocation "JP"
    Set-MgUserLicense -UserId $User.User -AddLicenses @($AddLicense) -RemoveLicenses @()
    
}
Disconnect-Graph

f:id:KKubo19:20210909221632p:plain

相変わらずForeachを利用し続けるくぼたなのでした!笑

 

 

  • 最後に!

Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!