【備忘】Office 365 ライセンス付与PowerShell(特定のサービスだけ有効化)①

Update:2019/09/02

【参考URL】

あるある

目新しいネタではなく、古くからのあるあるネタに関する備忘です。

「新しいユーザーにOffice 365 E3ライセンスをそのままつける!」
とかはそんなに大変ではないですが、ちょっと大変なのが、
「Office 365 E3の中であれ(ExO)と、これ(SPO)と、それ(ProPlus)だけつけたい」
みたいなやつ。もっと大変なのが、
「既存ユーザーはいろいろライセンスついてて、それに新しくあれ(Teams)と、それ(Flow)とこれ(Forms)を付けたい」
みたいなやつ。PowerShellで瞬殺でしょ、と思ってたら、実はそうでも無くて、悲しい思いをする。

めんどくさいので、みんなオンにしちゃえばいい。ただ、それができなくて、上記の「既存ユーザーはいろいろライセンスついてて……」のようなバラバラ ライセンス状態になっている会社さんもたくさんありそうですね。

こんな時にPowerShellでどう倒すかの備忘を書きます書きます。
できればAzureAD for Graphモジュールでやりたいけど、まだ慣れてないのでMSOnlineモジュール中心で。。

ライセンスの中で一部のサービスだけ有効にしたいときにやるべきこと

Office 365 E3の中であれ(ExO)と、これ(SPO)と、それ(ProPlus)だけつけたい。そんな時にどうするー。

とにかくライセンスつけるときに何をやればいいかを知りたい場合は、以下の①~⑤を順番にやる。
(なんかごちゃごちゃ説明して、章立てがよくわからなくなってきたので、簡易版ページ作りたくなってきた)
本文は、Set-MsolUserLicense コマンドの考え方から記載し、コマンドのオプションを指定するために次にやること……の順で説明しているので、やることの流れとは逆順の説明になっています。

① テスト ユーザーに手動で理想のライセンスを付与する
② テスト ユーザーのライセンス状態を調べる
⇒本記事の「無効にするサービスの名前とか、ライセンスのAccountSkuIDを調べる方法(こっちのが効率的でした)」項を参照

③ 無効にするサービスを「$DisablePlans」とかの変数に列挙する
④ 「$licenses」などの変数に以下2つを設定する
 ・付与するライセンス 例「O365のE3よー」
 ・無効にするサービスは「$DisablePlans」だよ
⇒ 「無効にするサービスの指定方法」を参照

⑤ 実際にユーザーにライセンスを付与するコマンド「Set-MsolUserLicense」を打つ
⇒ 「一部のサービスだけ有効にしたいときに実行するコマンドの考え方。」を参照
記事には書いていないけど、CSVでユーザー一覧を読み込んで、foreachすると、各ユーザー繰り返し実行できますね。

一部のサービスだけ有効にしたいときに実行するコマンドの考え方。

考え方としては、こう。「O365 E3ライセンスのサービスを全部つけるよ、その中で要らないやつはDisableにするよ。」
コマンドとしては ↓ なのだけど、コマンドを打つ前に、事前に「$licenses」に「その中で要らないやつはDisableにするよ。」の内容を設定をしておかないといけない。

# 【新規ライセンス割り当てするとき】
Set-MsolUserLicense -UserPrincipalName <UPN> -AddLicenses "<付与するライセンスの AccountSkuId>" -LicenseOptions $licenses

# 【割り当て済みライセンスのプランを変更するとき】(-AddLicenses オプションを使わないだけ)
Set-MsolUserLicense -UserPrincipalName <UPN> -LicenseOptions $licenses

※ ↑ の場合、既存のライセンス割り当てを無視して、コマンドで指定された内容を設定する、という動作になります。

無効にするサービスの指定方法

「$licenses」の設定方法は ↓ のブログの下記引用部分にある。まずは「$disabledplans」などの変数に、無効にするサービスを列挙する。そして「$License」などの変数で、「E3を割り当てて、その中で無効にするサービスは$disabledplansだよ」と設定してやる。

▼PowerShell 上で変数 disabledplans を作成し、無効とするサービス プランの情報を変数に格納します。
下記のコマンドを実行し、割り当てるライセンスのうち、無効にするサービスを指定し、変数 disabledplans に格納します。
$disabledplans = New-Object System.Collections.Generic.List[string]
$disabledplans.Add("<無効にする ServicePlan>")
$disabledplans.Add("<無効にする ServicePlan>")
・・・
$licenses = New-MsolLicenseOptions -AccountSkuId "<割り当てるライセンスの AccountSkuId>" -DisabledPlans $disabledplans
コマンド実行例:
※contoso:ENTERPRISEPACK ライセンスを割り当てる際に、Microsoft Teams、Sway、Yammer Enterprise を無効にする場合
$disabledplans = New-Object System.Collections.Generic.List[string]
$disabledplans.Add("TEAMS")
$disabledplans.Add("SWAY")
$disabledplans.Add("YAMMER_ENTERPRISE")
$licenses = New-MsolLicenseOptions -AccountSkuId "contoso:ENTERPRISEPACK" -DisabledPlans $disabledplans

ちなみに、「$disabledplans = New-Object System.Collections.Generic.List[string]」「$disabledplans.Add」とやらなくても、単純に「$disabledplans = "TEAMS","SWAY","YAMMER_ENTERPRISE"」というようにカンマ区切りで指定しても普通に動く。
あと、Intuneとかユーザーレベルで設定できないもの「PendingActivation」とかのステイタスになっているけど、Disableに入れても「PendingActivation」のまま変わらない。ここはどうするべきかは(??)よくわからない。

無効にするサービスの名前とか、ライセンスのAccountSkuIdを調べる方法

じゃあ、<無効にする ServicePlan>とか、<付与ライセンスの AccountSkuId>とかはどうやって見つけたらいいのか?

↑のページの「各ライセンスプランで利用可能なサービスを一覧表示するには、次のコマンドを使用します。」のところのコマンドを実行します。
事前にConnect-AzureADでテナントに接続しておくこと。一般人でも大丈夫。

$allSKUs=Get-AzureADSubscribedSku
$licArray = @()
for($i = 0; $i -lt $allSKUs.Count; $i++)
{
$licArray += "Service Plan: " + $allSKUs[$i].SkuPartNumber
$licArray +=  Get-AzureADSubscribedSku -ObjectID $allSKUs[$i].ObjectID | Select -ExpandProperty ServicePlans
$licArray +=  ""
}
$licArray

MsolServiceの方がいい場合はこっちで。事前にImport-Module MSOnlineとConnect-MsolServiceしておくこと。一般人でも大丈夫。

$AllLicenses = Get-MsolAccountSku
$licArray = @()
for($i = 0; $i -lt $AllLicenses.Count; $i++)
{
$licArray += "License: " + $AllLicenses[$i].AccountSkuId
$licArray +=  $AllLicenses[$i].ServiceStatus
$licArray +=  ""
}
$licArray

最後の「$licArrey」で標準出力に、テナントで持っているライセンスの一覧と、その中のサービスプラン一覧が出てきます。以下はMsolServiceの方でやってみた時。Connect-AzureADのGraph モジュールの方でやると、出力内容がちょっと違って、ApplyTo(適用対象がユーザーかテナント全体か)とか、ServicePlanId とか出てきます。

License: <テナントのonmicroの前のアレ>:ENTERPRISEPACK

ServicePlan           ProvisioningStatus
-----------           ------------------
KAIZALA_O365_P3       Success
MICROSOFT_SEARCH      Success
WHITEBOARD_PLAN2      Success
MIP_S_CLP1            Success
MYANALYTICS_P2        Success
BPOS_S_TODO_2         Success
FORMS_PLAN_E3         Success
STREAM_O365_E3        Success
Deskless              Success
FLOW_O365_P2          Success
POWERAPPS_O365_P2     Success
TEAMS1                Success
PROJECTWORKMANAGEMENT Success
SWAY                  Success
INTUNE_O365           PendingActivation
YAMMER_ENTERPRISE     Success
RMS_S_ENTERPRISE      Success
OFFICESUBSCRIPTION    Success
MCOSTANDARD           Success
SHAREPOINTWAC         Success
SHAREPOINTENTERPRISE  Success
EXCHANGE_S_ENTERPRISE Success

この中で必要ないものを、リストアップして、上の方に書いた「$licenses」にぽこぽこ入れていく。

そして「一部のサービスだけ有効にしたいときに実行するコマンド」項の「Set-MsolUserLicense」を実行するとライセンスがつく。

無効にするサービスの名前とか、ライセンスのAccountSkuIdを調べる方法(こっちのが効率的でした)

ここまで書いて思ったのは、テナントのライセンス一覧取らなくても、1人理想的なライセンスを当てて、その人のライセンス状態を表示してやれば、後はDisableになっている物を「$licenses」に入れていけばいいので、こっちのが楽ですね。

$userAccountUPN="<ユーザーのUPN指定>"
$AllLicenses=(Get-MsolUser -UserPrincipalName $userAccountUPN).Licenses
$licArray = @()
for($i = 0; $i -lt $AllLicenses.Count; $i++)
{
$licArray += "License: " + $AllLicenses[$i].AccountSkuId
$licArray +=  $AllLicenses[$i].ServiceStatus
$licArray +=  ""
}
$licArray

既存のライセンス状態を変えずに、特定のサービスだけ有効にしたい場合(②に続く)

できたらリンクを張る予定。

(途中経過メモ。②ページができたら以下の内容はお引越しします。)
既存ユーザーはいろいろライセンスついてて、それに新しくあれ(Teams)と、それ(Flow)とこれ(Forms)を付けたい。というときには、ここから。
※先に結論を申しておくと、なんかうまく動かなかったので保留中、自分でスクリプト書くか…という状態です。

既存の状態を変えずに、特定のサービスだけEnable/Disableにしたいときには、 ↓ のPowerShellモジュールの「Update-MSOLUserLicensePlan」コマンドが使えるらしいです。(注:MSの中の人が公開しているけど、公式モジュールではありません)

……が、ちょっとうまく動かなかった。

# M365 E3 ライセンスの中でTeamsのみを追加で有効にする
Update-MSOLUserLicenseplan -Users $NewUsers -Logfile C:\temp\add_license.log -SKU <テナントのonmicrosoft.comの前のところ>:S
PE_E3 -PlanstoEnable TEAMS1

↑ のコマンドは、$NewUsersに指定したユーザーに、M365 E3のライセンスの中でTeamsくんを追加で有効にする(既存のM365 E3の他プランの状態は変更しない)という内容であるが、なんかうまくいかなかったんだなぁ。途中でエラー出た。そんなSKUないよって、いや、ちゃんとあるよ!ミスしているわけでもないはずなのだが…。set-MSOLUserLicenseplanにしたらうまくいきましたが、setの場合、既存の他プランの状態も書き換えに行っちゃうので「ちょっとちがう」。

Update-MSOLUserLicensePlan の使用例を見てみましたが、うーん?あってるような。

PS C:\Windows\system32> get-help Update-MSOLUserLicensePlan -example

名前
   Update-MSOLUserLicensePlan
概要
   UPDATES the current plan settings for an assigned SKU while maintaining existing plan set
   tings.

   -------------------------- 例 1 --------------------------
   PS C:\>Update-MSOLUserLicensePlan -Users $Promoted -Logfile C:\temp\add_license.log -SKU
   company:ENTERPRISEPACK -PlanstoEnable SWAY,TEAMS1,EXCHANGE_S_ENTERPRISE,YAMMER_ENTERPRISE
   ,OFFICESUBSCRIPTION
   Adds the enabled Plans SWAY,TEAMS1,EXCHANGE_S_ENTERPRISE,YAMMER_ENTERPRISE,OFFICESUBSCRIP
   TION to the ENTERPRISEPACK for all users in $Promoted. Maintaining any existing plan sett
   ings.

うーん、謎。

自分でスクリプト考えてみるかな。

私のド嵌り記事があなたの役に立ったのならうれしいです。 ( * ´・ω・)