PowerShellで一括!CSVにユーザをリスト出力してOffice365ライセンスを付与する

こんにちはますのです。
新卒入社や中途入社でOffice365ライセンスを付与する時、5人以上になってくると億劫になる怠惰な人間です。Microsoftのサポートにダメ元で「一括でライセンス付与や変更するやり方は無いのですか??」と質問しました。するとなんと「可能ですぜ!」と返答をもらった次第です。うひょー!聞けるところがあるって素晴らしいということを噛み締めながら、マニュアル化したのでメモしていきます。

一括変更のPowerShellスクリプトを動かすためには、事前準備としてMSOnlineに接続するためのモジュールをインストールする必要があります。詳細は別記事に書いてあるのでそちらを参考に。

事前準備:MSOnline (Azure AD v1)をインストールする方法

環境と課題

  • 環境:ActiveDirectory→Office365へAzureADConnectを利用して15分毎に同期している。
  • 課題:ユーザは自動登録されるが、ライセンスの付与が出来ていない状態となる。
  • やりたいこと:ADから連携されたユーザに、一括でOffice365ライセンスを付与したい。

Windows PowerShellからMSOnlineへログインをする

事前準備のモジュールインストールが完了したら、以下の手順通り進んでいきます。

  1. PowerShellを管理者権限で実行します
  2. 「Connect-MsolService」コマンドを実行します
    PS c:¥ >Connect-MsolService
  3. 認証画面が表示されるため、Office365の管理者アカウントのIDとパスワードを入力し、ログインが完了となります。

Office365内に登録されているユーザリストのCSVデータを作成する

  • Case1:Office365内の全ユーザを出力する場合
PS c:¥ > Get-MsolUser -All | % {“{0},{1},{2},{3},{4},{5}” -F $_.DisplayName ,$_.UserPrincipalName,$_.Licenses[0].AccountSkuId,$_.Licenses[1].AccountSkuId,$_.Licenses[2].AccountSkuId,$_.Licenses[3].AccountSkuId } | Out-File “C:\temp\UserlicensesALL.csv” -Encoding UTF8
ライセンスの付与の有無に関わらず、Office365に登録されているユーザの一覧とライセンス付与内容を出力できます。ライセンス付与状況を確認することにも使えると何かと使う機会がありました。
  • Case2:ENTERPRISEPACKアカウントが付与されているユーザのメールアドレスのみ抽出
PS c:¥ > Get-MsolUser -All | where {$_.Licenses.AccountSkuID -contains “(テナント名):ENTERPRISEPACK”} | Select-Object UserPrincipalName | export-csv C:\temp\UserlicensesALL.csv -Encoding UTF8 -NoTypeInformation
  • Case3:EMSアカウントが付与されているユーザのメールアドレスのみ抽出
PS c:¥ > Get-MsolUser -All | where {$_.Licenses.AccountSkuID -contains “(テナント名):EMS”} | Select-Object UserPrincipalName | export-csv C:\temp\UserlicensesALL.csv -Encoding UTF8 -NoTypeInformation
Case2とCase3の(テナント名)の箇所は、「(テナント名).onmicrosoft.com」を入れてみてください。

インポート用のCSVを取り込み可能な形式に整形する

  1. CSVの1行目に「UserPrincipalName」を記載する
    記載例)UserlicensesALL.csv
    UserPrincipalName
    a@example.co.jp
    b@example.co.jp
  2. CSVに記載するユーザ情報:ライセンス操作を実施する対象のユーザのみを記載する
  3. 新規ユーザを登録する場合:ライセンスが登録されていたり、Office365上で「所在地」が設定されていないことを確認する

上記①〜③を考慮していないとPowerShell実行時にエラーが出てしまうので注意が必要です。
①についてはいい方法ありそうだなぁとは思いながらも、自動化させないから良いかと手動で入れている次第です。面倒臭がりですみませんです。。。。

対象ライセンスのPowerShellコマンド用の名称を確認する

  1. Office365のライセンス名称を確認するコマンドを実行する

    PS C:¥ > Get-MsolAccountSku | select AccountSkuId,SkuPartNumber

    AccountSkuId SkuPartNumber
    ———— ————-
    (テナント名):ENTERPRISEPACK ENTERPRISEPACK
    (テナント名):FLOW_FREE FLOW_FREE
    (テナント名):POWER_BI_STANDARD POWER_BI_STANDARD
    (テナント名):EMS EMS

  2. 「ENTERPRISEPACK」内のサービス名称を一覧化し、確認するコマンドを実行する。
    ※①で調べた「SkuPartNumber」を差し替えれば、EMSなどの詳細を確認することも出来ますので臨機応変に変更します。

    PS c:¥ > Get-MsolAccountSku | where {$_.SkuPartNumber -eq “ENTERPRISEPACK”} | foreach {$_.ServiceStatus} | foreach {$_.Serviceplan} | select servicename
  3. ②で調べたサービス名から、「ユーザに付与をしないサービス名」を選択する。
    このあとのライセンス付与の作業では、付与したいサービス名ではなく、付与しないサービス名を記述することになるので逆転しないように注意が必要です!

PowerShellでCSVデータ内の対象者に対してENTERPRISEPACKやEMSなどのライセンスを付与する

CSVの対象者リストとサービス名を確認したら実際にPowerShellコマンドでライセンス付与をしていきましょう!
今回の例では、以下を想定して実施しています。
①新規登録されたばかりのユーザに対して「所在地:日本」を設定
②「ENTERPRISEPACK:Mobile Device Management for Office 365、Exchange Online以外を付与する」

  1. 新規作成されたユーザに対して所在地を設定する
    ※既にライセンスが付与されているユーザの場合は実行不要です。

    PS c:¥ > Import-csv “C:\temp\UserlicensesALL.csv” | foreach {Set-MsolUser -UserPrincipalName $_.UserPrincipalName -UsageLocation “JP” }

    実行完了にはユーザ数によっては時間が掛かります。
    また、リストに所在地が設定済みのユーザがいるとエラーが表示されるので注意です。

  2. ENTERPRISEPACKのサービスで付与をしないライセンスを変数「$MyO365Sku」に設定する
    PS c:¥ > $MyO365Sku = New-MsolLicenseOptions -AccountSkuId (テナント名):ENTERPRISEPACK -DisabledPlans INTUNE_O365,RMS_S_ENTERPRISE,EXCHANGE_S_ENTERPRISE

    Mobile Device Management for Office 365、Exchange Onlineの2つは付与しないライセンスになりますので、対象のサービス名を変数に登録します。

  3. CSVの対象ユーザに対して、ライセンス付与を実行する
    PS c:¥ > Import-csv “C:\temp\UserlicensesALL.csv” | foreach { Set-MsolUserLicense -UserPrincipalName $_.UserPrincipalName -AddLicenses “(テナント名):ENTERPRISEPACK” -LicenseOptions $MyO365Sku }

    はい!このコマンドを実行すると、Office365のユーザアカウントに順々に付与されていきます。
    実際にOffice365の管理画面へアクセスして、CSVリストの一番上のユーザを確認してみましょう。わたしはこれで設定出来ました!

余談:ライセンス登録済みユーザに対して割り当てるサービスを変更する

先程の設定は新規で付与する方法でしたので、既に付与しちゃってるアカウントではどうすればいいのよ。ってありますよね??その時のコマンドも貼り付けておきますので、参考にしてくださいませませ!

  1. 基本は同じ!付与をしないサービス名を「$MyO365Sku」に設定する
    ※例)Skpe for Business(MCOSTANDARD)のみオフ、それ以外のサービスをオンとしたい場合

    PS c:¥ > $MyO365Sku = New-MsolLicenseOptions -AccountSkuId (テナント名):ENTERPRISEPACK -DisabledPlans MCOSTANDARD
  2. ライセンスオプションのみ変更を掛けるコマンドを実行する
    PS c:¥ > Import-csv “C:\temp\UserlicensesALL.csv” | foreach { Set-MsolUserLicense -UserPrincipalName $_.UserPrincipalName -LicenseOptions $MyO365Sku }

    新規追加のときは「AddLicenses」をつけていましたが、変更時は既に付与されているので不要になります。

最後にPowerShell上で「exit」で終了!

はい、ライセンス付与が完了したらコマンドで「exit」と入力するとPowerShell画面が閉じますので完了です。

数人程度であれば手動で設定したほうが早いのですが、流石に10人以上となると面倒ですからね。このあたりのライセンス付与も自動化出来れば運用が簡単になるのになぁと思いながらも、着手は出来ておらずです。
ある程度不便な方が管理者の個々の知識があがるって誰かが言ってたと言い訳して日々過ごしています。

今後Office365の管理をしようとする際は役に立つちますのでぜひ参考になさってください!

 

最新情報をチェックしよう!