前回の記事では、パスワードレス認証の方法として、一時アクセスパスを構成後、ユーザーに対して一時アクセスパスを発行する方法をご紹介させていただきました。
しかし、前回ご紹介した方法は、Microsoft Entra ID管理センターでユーザーに対して一人ずつ一時アクセスパスを発行する必要があり、大人数のユーザーに対して一時アクセスパスを発行するとなると大きな運用負荷がかかります。
そこで、今回は.csvファイルを使用して、一括でユーザーに対して一時アクセスパスを発行する方法を紹介したいと思います。
事前準備
本章では.csvファイルで一括配布する際に必要な事前準備について記載します。
なお、本記事のPowerShellのスクリプトは、下記の記事で紹介されているものを参考に、要件に合わせてアレンジをしています。この場を借りて感謝を申し上げます。
一時アクセスパス発行用PowerShellスクリプトファイルの作成
- 下記のスクリプトをコピーし、Notepadにペーストします。
# PowerShellスクリプトのディレクトリを取得 $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition # モジュールがインストールされているか確認し、インストールされていない場合にのみインストール if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Identity.Signins)) { Install-Module Microsoft.Graph.Identity.Signins -Force } if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Users)) { Install-Module Microsoft.Graph.Users -Force } Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force Import-Module Microsoft.Graph.Identity.SignIns Import-Module Microsoft.Graph.Users Connect-MgGraph -Scopes "UserAuthenticationMethod.ReadWrite.All", "User.Read.All" -NoWelcome # 一時アクセスパスの有効期間を2回入力させる do { $TAP_Lifetime1 = Read-Host "Temporary Access Pass の有効期間 (分) を入力してください。" $TAP_Lifetime2 = Read-Host "確認のためもう一度 Temporary Access Pass の有効期間 (分) を入力してください。" if ($TAP_Lifetime1 -ne $TAP_Lifetime2) { Write-Host "入力が一致しません。もう一度入力してください。" } } while ($TAP_Lifetime1 -ne $TAP_Lifetime2) # System.Windows.Forms アセンブリをロード Add-Type -AssemblyName System.Windows.Forms # 有効期限確認ダイアログを表示 $confirmation = [System.Windows.Forms.MessageBox]::Show("一時アクセスパスの有効期間は $TAP_Lifetime1 分です。よろしいですか?", "確認", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question) if ($confirmation -ne [System.Windows.Forms.DialogResult]::Yes) { Write-Output "処理をキャンセルしました" exit } $FileLoadDialog = New-Object System.Windows.Forms.OpenFileDialog $FileLoadDialog.Filter = "CSV File|*.csv" $FileLoadDialog.Title = "ユーザー リストを選択してください" if ($FileLoadDialog.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) { Write-Output "処理をキャンセルしました" $FileLoadDialog.Dispose() exit } $Load_CSV_Path = $FileLoadDialog.FileName $FileLoadDialog.Dispose() # 現在の日付と時間を取得してファイル名に追加 $now = Get-Date -Format "yyyyMMdd_HHmmss" $Save_CSV_Path = "$scriptDir\一時アクセスパス発行結果_$now.csv" $UPNs = Import-Csv $Load_CSV_Path $properties = @{ isUsableOnce = $False LifetimeInMinutes = $TAP_Lifetime1 } $propertiesJSON = $properties $TAP_Exports = New-Object System.Collections.ArrayList $success = $true Foreach($UPN in $UPNs){ try { $TAP_Export = New-Object PSObject | Select-Object UserPrincipalName, Mail, Manager_Mail, TemporaryAccessPass, TAP_StartDateTime_JST, TAP_LifetimeInMinutes, TAP_Expiration_JST $TAP_Export.UserPrincipalName = $UPN.Users $TAP_Export.Mail = Get-MgUser -UserId $UPN.Users | ForEach-Object {$_.Mail} $TAP_Info = New-MgUserAuthenticationTemporaryAccessPassMethod -UserId $UPN.Users -BodyParameter $propertiesJSON $TAP_Export.TemporaryAccessPass = $TAP_Info.TemporaryAccessPass $TAP_Export.TAP_StartDateTime_JST = $TAP_Info.StartDateTime.AddHours(9) $TAP_Export.TAP_LifetimeInMinutes = $TAP_Info.LifetimeInMinutes $TAP_Export_StartDateTime_UTC = $TAP_Info.StartDateTime.AddMinutes($TAP_Info.LifetimeInMinutes) $TAP_Export.TAP_Expiration_JST = $TAP_Export_StartDateTime_UTC.AddHours(9) $TAP_Export.Manager_Mail = Get-MgUserManager -UserId $UPN.Users -ErrorAction SilentlyContinue | ForEach-Object {Get-MgUser -UserId $_.id } | ForEach-Object {$_.Mail} [void]$TAP_Exports.Add($TAP_Export) } catch { $success = $false Write-Host "エラーが発生しました: $_" } } $TAP_Exports | Export-Csv $Save_CSV_Path -NoTypeInformation -Encoding UTF8 -NoClobber if ($success) { # 完了ダイアログを表示 [System.Windows.Forms.MessageBox]::Show("一時アクセスパスが正常に発行されました。結果は $Save_CSV_Path に保存されました。", "完了", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Information) } else { Write-Host "一部の一時アクセスパスの発行に失敗しました。" } Remove-Variable -Name TAP_Info, TAP_Export, TAP_Exports, TAP_Lifetime1, TAP_Lifetime2, TAP_Export_StartDateTime_UTC - ファイル名を[TAPScript」にし、拡張子を[.ps1]に変更します。エンコーディングは[UTF-8 with BOM]に変更します。変更できたら[保存]をクリックします。

PowerShellスクリプトをキックするためのバッチファイルの作成
本節では、前節で作成したPowerShellスクリプトを実行するためのバッチファイルを作成します。
- 下記のコマンドをコピーし、NotePadにペーストします。
@echo off chcp 65001 >nul set scriptPath=%~dp0TAPScript.ps1 powershell -ExecutionPolicy Bypass -File "%scriptPath%" pause - ファイル名を[スクリプト実行]にし、拡張子を[.bat]と入力します。エンコードは[UTF-8]を選択します。設定ができたら[保存]をクリックします。

一時アクセスパス発行対象のユーザーを記載する.CSVファイルの作成
- NotePadを起動します。
- 一行目にUsersと記載します。

- ファイル名を[Userlist]とし、拡張子を[.csv]と入力します。エンコードは[UTF-8]を入力します。設定ができたら[保存]をクリックします。

.CSVファイルを使用した一時アクセスパスの発行方法
本章では、事前準備で用意したスクリプトを元に、一時アクセスパスを発行する方法を記載します。。
- 事前準備で作成したスクリプトを一つのフォルダにまとめておきます。
- [Userlist.csv]を右クリックし、[編集]をクリックします。

- テキストエディタが起動されるので「Users」の下に、発行したいユーザーのプリンシパルネームを記載します。

- 発行するユーザーを記載できたら[ファイル]>[保存]をクリックします。

- [スクリプト実行.bat]を右クリックし、[管理者として実行]をクリックします。

- 実行ポリシー変更の確認画面が表示されたら[y]をクリックします。

- 続行の確認画面が表示されたら[y]をクリックします。

- リポジトリ信頼画面で[y]を入力します。

- サインイン画面が表示されるので、管理者アカウントを入力します。

- パスワードを入力し、[サインイン]をクリックします。

- 発行する一時アクセスパスの有効期間を入力し、Enterをクリックします。
※表示されるまで20秒程時間がかかる場合があります。

- 確認のため有効期間をもう一度入力し、Enterをクリックします。

- 最後に確認ダイアログが表示されるので、一時アクセスパスの有効期間に問題がなければ[はい]をクリックします。

- 3.で作成した[Userlist.csv]のファイルを選択し、[開く]をクリックします。

- 発行が正常に完了したら[完了のダイアログ]が表示されるため[OK]をクリックします。

- 15.で記載されたパスにパスワードリストのファイルが作成されていることを確認します。

- 作成された「一時アクセスパス発行結果_yyyymmdd_hhmmss」ファイルを開き、一時アクセスパスが発行されていることを確認します。

最後に
以上が.csvファイルを使用した一括でユーザーに一時アクセスパスを発行する方法になります。本記事が参考になれば幸いです。
なお、本記事で記載しているスクリプトを実行するためには最低でも「認証管理者ロール」と「クラウドアプリケーション管理者ロール」のロールが必要になります。
金山 翔太(日本ビジネスシステムズ株式会社)
Microsoft製品(主にMicrosoft 365やIntune)などの設計に携わったことがあります。趣味はゲームとキャンプです。業務上で学んだことを発信していきます。
担当記事一覧