Site cover image

🐧 きまぐれクラウド日記

NotionをヘッドレスCMSとして利用しています。 AzureとMirosoft 365 に関することを備忘録と頭の整理の為に書いていきます。

🐧 Microsoft 365 ユーザーをPowerShellで一括作成する

大量のMicrosoft 365 ユーザーをGUIで作成するのは時間がかかる上にミスが出るので非効率です。

この記事では、PowerShellを用いてCSVファイルのデータを読み取りユーザー作成を一括で行います。

環境

  • Microsoft 365 のテナント
  • Microsoft Graph PowerShell SDK
  • PowerShell version : 7.3.4

作成

ユーザー作成用のCSV作成

以下の表に合わせてCSVのファイルを作成してください。

UserPrincipalName DisplayName Password
[email protected] aaaa Password1234a
[email protected] bbbb Password1234b
[email protected] cccc Password1234c

姓名や電話番号を入れたい場合は以下のように列を追加して作成します。

Surname GivenName JobTitle Department BusinessPhones MobilePhone
aaaa example 部長 Sales xxx-xxxx-xxxx xxx-xxxx-xxxx
bbbb example Sales xxx-xxxx-xxxx xxx-xxxx-xxxx
cccc example Sales xxx-xxxx-xxxx xxx-xxxx-xxxx

環境作成

Microsoft Graph PowerShell SDK がインストールされていない方は以下のコマンドを実行します。

#Microsoft Graph PowerShell SDK をインストールする
Install-Module Microsoft.Graph

以下のコマンド実行ポリシーを設定します。

#実行ポリシーを設定する
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

モジュールのインポートをします。

#Microsoft Graph PowerShellモジュールのインポート
Import-Module Microsoft.Graph

ユーザー作成

Microsoft Graph APIに接続に接続します。

#接続
Connect-MgGraph -Scopes "Directory.ReadWrite.All"

先程作成したCSVファイルを読み込みます。パスは書き換えてください。

#CSV読み込み
$CSVs = Import-Csv -Encoding UTF8 `
-Path "<CSVファイルへのパス>"

ユーザー作成のコマンドを実行します。

#ユーザー作成
foreach($CSV in $CSVs)
{
    $PasswordProfile = @{ 
        forceChangePasswordNextSignIn = $true #trueは初回サインイン時にパスワード変更
        Password = $CSV.Password
    }

    #UPNの@より前をmailNickNameとして取得します。
    $txt = $CSV.UserPrincipalName
    $re = "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@"
    $mailNickname = [regex]::Match($txt, $re, "IgnoreCase").Value.Replace("@","")

		#必須
    New-MgUser -DisplayName $CSV.DisplayName `
    -UserPrincipalName $CSV.UserPrincipalName `
    -AccountEnabled `
    -MailNickName $mailNickname `
    -PasswordPolicies "DisablePasswordExpiration" `
    -PasswordProfile $PasswordProfile `
    -UsageLocation "JP" `
    -PreferredLanguage "ja-JP" 

		#オプション、値が空の場合でも受け取れるように1行ずつ実行する。
    Update-MgUser -UserId $CSV.UserPrincipalName -JobTitle $CSV.JobTitle 
    Update-MgUser -UserId $CSV.UserPrincipalName -Surname $CSV.Surname
    Update-MgUser -UserId $CSV.UserPrincipalName -GivenName $CSV.GivenName
    Update-MgUser -UserId $CSV.UserPrincipalName -Department $CSV.Department
    Update-MgUser -UserId $CSV.UserPrincipalName -BusinessPhones $CSV.BusinessPhones
    Update-MgUser -UserId $CSV.UserPrincipalName -MobilePhone $CSV.MobilePhone
}

確認

CSVファイルのユーザーが作成されているか確認を取ります。作成できていないユーザーは赤字で「ユーザーは存在しません」みたいなエラーが出ます。

実行結果は変数に格納されているため、値が欲しい場合は変数を呼び出します。

#確認
$MgUsers = foreach($CSV in $CSVs)
{
    Get-MgUser `
    -UserId $CSV.UserPrincipalName `
    | select-Object DisplayName,UserPrincipalName,JobTitle,Surname,GivenName,Department,BusinessPhones,MobilePhone
}

作業証跡として確認用のCSVファイルを作成する場合は以下のコマンドを実行します。

エラーが出る場合は「-Encoding utf8BOM」を「-Encoding utf8」に書き換えて実行します。

#確認用のCSVファイル作成
$MgUsers | export-CSV -Path "ファイルへのパス+ファイル名" -Append -Encoding utf8BOM

作業終了したのでMicrosoft Graph APIからの接続を切断します。

#切断
Disconnect-Graph

参考