PowerShell で Microsoft 365 のユーザーを一括登録する

2021年3月2日

Web 会議の利用が進んでいることもあって、Microsoft 365 を新規導入することになった企業も多いのではないでしょうか。利用者が多いと管理画面から1人1人ユーザーを登録するのは面倒です。管理画面からも CSV ファイルをアップロードしてユーザーを一括登録することができますが、パスワードの設定やライセンスの割り当てができないので、思ったほど省力化することができません。そこで今回は PowerShell を使って、Microsoft 365 のユーザーを一括登録する方法を紹介します。

準備と注意

以下の手順で一括登録するためには、Windows 10 に標準でインストールされている PowerShell を使う必要があります。現状では以前紹介した PowerShell 7(PowerShell Core)ではうまくいかないのでご注意ください。

  1. IT プロフェッショナル 用 Microsoft Online Services サインイン アシスタント RTWをインストールする
  2. Windows PowerShell を管理者として実行し、以下のコマンドを実行する
    1. Install-Module MSOnline コマンドを実行
    2. NuGet プロバイダーをインストールするようにメッセージが表示されたら、「Y」と入力し、ENTER を押す
    3. PSGallery からモジュールをインストールするようにメッセージが表示されたら、「Y」と入力し、Enter を押す

ここまでで準備は完了です。この先は管理者でなくても問題ありません。

所有しているライセンスを確認する

Windows PowerShell を開き、以下のコマンドを実行します。

Connect-MsolService

Microsoft 365 のログイン画面が表示されるので、Microsoft 365 の管理者のログイン情報を入力します。続いて、以下のコマンドを入力します。

Get-MsolAccountSku

現在保有しているライセンスの情報が表示されるので、AccountSkuId の値を控えておいてください。

AccountSkuId                    ActiveUnits WarningUnits ConsumedUnits
------------                    ----------- ------------ -------------
example:SMB_BUSINESS_ESSENTIALS 11          0            0
example:SMB_BUSINESS_PREMIUM    1           0            0

ActiveUnits が保有しているライセンス、ConsumedUnits が保有しているライセンスのうち、ユーザーに割り当てられているものの数です。

CSV の準備

以下の内容で CSV を作成します。文字コードは UTF-8、改行コードは CRLF で。後でパスを指定することになるので、わかりやすい場所に保存しておきます(C:\temp\user.csv など)。

UserPrincipalName,DisplayName,FirstName,LastName,Password,UsageLocation,AccountSkuId
t.yamada@example.com,山田 太郎,太郎,山田,Pass1234,JP,example:SMB_BUSINESS_ESSENTIALS

一括登録の実行

いよいよ一括登録の実行です。以下のコマンドを実行します。

Connect-MsolService
# Microsoft 365 のログイン情報を入力

Import-Csv -Path C:\temp\user.csv | foreach {New-MsolUser -DisplayName $_.DisplayName -FirstName $_.FirstName -LastName $_.LastName -UserPrincipalName $_.UserPrincipalName -UsageLocation $_.UsageLocation -LicenseAssignment $_.AccountSkuId -Password $_.Password -ForceChangePassword $False} | Export-Csv -Path C:\temp\user_result.csv

-ForceChangePassword $False を付けることで、設定したパスワードをそのまま使うことができます。-ForceChangePassword $True にすると、初回ログイン時にパスワードの設定を要求されるようになります。

登録する人数が多いと少し時間がかかりますが、じっと待ちましょう。実行結果は C:\temp\user_result.csv に出力されます。

メールボックスの言語設定を変更する

上記の手順でユーザーの登録とライセンスの割り当ては終わっていますが、日本語環境で使用する場合には、もう少し作業を続けます。登録直後に Outlook を起動すると、[受信トレイ] が [Inbox] と表示されることがあります。これは言語設定が日本語になっていないために起きる現象です。後からユーザーレベルで変更することも可能ですが、まとめて設定してしまいましょう。

$UserCredential = Get-Credential
# Microsoft 365 のログイン情報を入力

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking
Import-Csv -Path C:\temp\user.csv | foreach {Set-MailboxRegionalConfiguration -Identity $_.UserPrincipalName -DateFormat "yyyy/MM/dd" -TimeFormat "H:mm" -TimeZone "Tokyo Standard Time" -LocalizeDefaultFolderName:$True -Language "ja-JP"}

こちらのコマンドは PowerShell 7 でも実行可能です。実行時に「スクリプトの実行がシステムで無効になっているため、ファイルを読み込めません。」と表示されたときは、管理者権限で PowerShell を起動し

Set-ExecutionPolicy RemoteSigned

を実行してください。

設定できたかどうかは

Get-Mailbox -Filter "RecipientTypeDetails -eq 'UserMailbox'" | Get-MailboxRegionalConfiguration

で確認できます。

Identity             Language        DateFormat TimeFormat TimeZone
--------             --------        ---------- ---------- --------
t.yamada             ja-JP           yyyy/MM/dd H:mm       Tokyo Standard Time

のように表示されたら設定できています。

おまけ:予定表のアクセス権限を設定する

デフォルトでは、他のユーザーの予定表は予定がある部分に [予定あり] と表示されるだけで、詳細が確認できません。ユーザーが個別に設定を変更することもできますが、デフォルトで予定の詳細を表示できるようにするには、以下のコマンドを実行します。

Import-Csv -Path C:\temp\user.csv | foreach {Set-MailboxFolderPermission -Identity "$($_.UserPrincipalName):\予定表" -User "Default" -AccessRights Reviewer}

-AccessRights Reviewer の部分を変更すれば、別の権限を与えることができます。主な権限は以下の通りです。詳細はこちらをご覧ください。

権限名権限の内容
None権限なし
AvailabilityOnly空き時間情報のみ閲覧可(デフォルト)
LimitedDetails空き時間情報、件名、場所を閲覧可
Reviewerすべての予定情報を閲覧可
Authorすべての予定情報を閲覧可、予定の作成、予定の編集・削除(自分が作成したもののみ)
Editorすべての予定情報を閲覧可、予定の作成、すべての予定の編集・削除
Owner本人と同じ権限
設定できる主な権限

上の手順で言語設定を日本語にしていない場合、$($_.UserPrincipalName):\予定表 の部分を $($_.UserPrincipalName):\Calendar" に変更してください。

この記事を書いた人

グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。詳しい業務内容はこちら。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。