こんにちは、伊藤です。
Microsoft Entra IDでは、CSVファイルによるアカウント作成、削除の一括処理機能がありますが、パスワードの一括リセット機能はありません。
また、管理者がMicrosoft Entra IDのパスワードをリセットする場合、一般的には以下のようにユーザーの概要ページから実行します。しかし、この方法では任意のパスワードを指定できません(オンプレミスADとのアカウント同期とパスワードの書き戻しが有効な場合を除く)。


そこで今回は、これらの課題を解決するため、CSVファイルを使ってMicrosoft Entra IDのユーザーパスワードを一括でリセットするPowerShellスクリプトと、その使い方を紹介します。
本稿で取り上げた課題およびコードは2025年10月段階のものであり、今後のMicrosoft Entra IDの更新により解決されたり、修正が必要になったりする場合があります。
前提条件
・Microsoft Entra IDテナントと、そのユーザーに対してパスワードリセットを実行できる管理者アカウントを保有していること
・使用するPowerShellにMicrosoft Graph PowerShell SDKがインストールされていること
以下のコマンドでMicrosoft Graph PowerShell SDKをインストールできます。Install-Module Microsoft.Graph.Users -Scope CurrentUser
パスワードリセット用CSVファイルを作成する
一括パスワードリセット用のCSVファイルを作成します。
ユーザープリンシパル名(UserPrincipalName)、パスワード(Password)の列を指定します。
パスワードを指定しない場合は、スクリプトがランダムなパスワードを生成します。
例:
UserPrincipalName,Password
test01@example.com,P@ssw0rd
test02@example.com,
PowerShellスクリプトを作成する
PowerShellスクリプトファイルを作成します。-InputFile
オプションでCSVファイルを指定し、-OutputFile
オプションで一括パスワードリセット結果のファイルを指定できるようにします。-OutputFile
を指定しない場合は、タイムスタンプ付きのファイルが作成されます。例:reset_results_20250829155001.csv
CSVファイルでパスワードを指定したユーザーはそのパスワードに、指定しなかったユーザーはランダムに生成されたパスワードにリセットされます。ランダムパスワードは、英大文字、英小文字、数字、記号がそれぞれ2文字以上含まれる16文字のランダム値を生成します。
・entraidpasswordreset.ps1
#requires -Modules Microsoft.Graph.Users
param(
[Parameter(Mandatory = $true, HelpMessage = "ユーザーリストのCSVファイルパスを指定してください")]
[string]$InputFile,
[Parameter(HelpMessage = "結果を出力するCSVファイルパスを指定してください")]
[string]$OutputFile = ".\reset_results_$(Get-Date -Format 'yyyyMMddHHmmss').csv"
)
# Microsoft Graphに接続します (未接続の場合)
if (-not (Get-MgContext)) {
Write-Host "Microsoft Graphに接続します..." -ForegroundColor Yellow
# 必要なアクセス許可スコープを指定して接続
Connect-MgGraph -Scopes "User-PasswordProfile.ReadWrite.All"
}
# 結果を格納するための空の配列を作成
$results = @()
# CSVファイルからユーザーリストをインポート
try {
$users = Import-Csv -Path $InputFile
}
catch {
Write-Host "エラー: 入力ファイルが見つからないか、読み込めません。パスを確認してください: $InputFile" -ForegroundColor Red
return
}
Write-Host "パスワードリセット処理を開始します..." -ForegroundColor Cyan
# 各ユーザーに対してループ処理
foreach ($user in $users) {
$upn = $user.UserPrincipalName
$newPassword = $null
$forceChangeOnNextSignIn = $true # 次回サインイン時にパスワード変更を強制
try {
# CSVにPassword列が存在し、かつ値が空でないかチェック
if ($user.PSObject.Properties.Match('Password') -and -not [string]::IsNullOrEmpty($user.Password)) {
# --- パターン1: CSVで指定されたパスワードを使用 ---
$newPassword = $user.Password
Write-Host "[$upn] CSVで指定されたパスワードを設定します。"
}
else {
# --- パターン2: ランダムなパスワードを生成 ---
Write-Host "[$upn] ランダムパスワードを生成します。"
$charSets = @{
Upper = 'ABCDEFGHIJKLMNPQRSTUVWXYZ'
Lower = 'abcdefghijlkmnpqrstuvwxyz'
Number = '0123456789'
Symbol = '@#$%^&*-_!+=[]{}|\:'',.?/`~"();<>'
}
$passwordChars = [char[]]($charSets.Upper.ToCharArray() | Get-Random -Count 2) +
[char[]]($charSets.Lower.ToCharArray() | Get-Random -Count 2) +
[char[]]($charSets.Number.ToCharArray() | Get-Random -Count 2) +
[char[]]($charSets.Symbol.ToCharArray() | Get-Random -Count 2)
$remainingChars = [char[]]($charSets.Values -join '') | Get-Random -Count 8
$newPassword = ($passwordChars + $remainingChars | Get-Random -Count 16) -join ''
}
# パスワードリセットの実行
$passwordProfile = @{
ForceChangePasswordNextSignIn = $forceChangeOnNextSignIn
Password = $newPassword
}
Update-MgUser -UserId $upn -PasswordProfile $passwordProfile -ErrorAction Stop
Write-Host "成功: $($upn) のパスワードをリセットしました。" -ForegroundColor Green
$results += [PSCustomObject]@{
UserPrincipalName = $upn
NewPassword = $newPassword
Status = "Success"
}
}
catch {
$errorMessage = $_.Exception.Message
Write-Host "失敗: $($upn) のパスワードリセット中にエラーが発生しました。エラー: $errorMessage" -ForegroundColor Red
$results += [PSCustomObject]@{
UserPrincipalName = $upn
NewPassword = "N/A"
Status = "Failed - $errorMessage"
}
}
}
# 結果をCSVファイルに出力
$results | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
# Microsoft Graphから切断します
Write-Host "Microsoft Graphから切断します..." -ForegroundColor Yellow
Disconnect-MgGraph
Write-Host "全ての処理が完了しました。結果は '$($OutputFile)' を確認してください。" -ForegroundColor Cyan
このスクリプトは、ユーザーが次回サインインする際にパスワードの変更を強制します。
もしパスワード変更を強制したくない場合は、スクリプト内の以下の行を見つけ、値を$true
から$false
に修正してください。
変更前:
$forceChangeOnNextSignIn = $true # 次回サインイン時にパスワード変更を強制
変更後:
$forceChangeOnNextSignIn = $false # 次回サインイン時にパスワード変更を強制しない
PowerShellスクリプトを実行してユーザーパスワードを一括リセットする
PowerShellスクリプトを実行します。
例:
> .\entraidpasswordreset.ps1 -InputFile .\reset_users.csv -OutputFile .\reset_users_result.csv
Microsoft Graphに未接続の場合はログイン画面が表示されます。Microsoft Entra IDのユーザーに対してパスワードリセットを実行できる管理者アカウントでログインします。

Microsoft Graphに接続後はパスワードリセット処理が実行されます。
パスワードリセットに成功した場合は「成功: <ユーザープリンシパル名>のパスワードをリセットしました。」と表示されます。
パスワードリセットに失敗した場合は「失敗: <ユーザープリンシパル名>のパスワードリセット中にエラーが発生しました。」と表示されます。

全ての処理が完了すると、一括パスワードリセット結果が出力用のCSVファイルに書き込まれます。このファイルには、ユーザープリンシパル名、新しいパスワード、そして処理結果(成功の場合は「Success」、失敗の場合は「Failed – <エラーの詳細>」)が記録されます。
例:
"UserPrincipalName","NewPassword","Status"
"pwreset-test01@example.com","deko89IFLEU","Success"
"pwreset-test02@example.com","H7T*#t9smrahS@3U","Success"
"pwreset-test03@example.com","N/A","Failed - [Request_BadRequest] : The specified password does not comply with password complexity requirements. Please provide a different password."
パスワードリセットの失敗例
パスワードリセットに失敗した場合のよくある原因を以下に示します。
Microsoft Graphに接続できない
Microsoft Graphに接続できなかった場合は以下のエラー文が表示されます。
Authentication needed. Please call Connect-MgGraph.
ユーザーがMicrosoft Entra IDテナント内に存在しない
Microsoft Entra IDテナント内に存在しないユーザープリンシパル名を指定すると、対象ユーザーが存在しないためエラーになります。この場合は以下のエラー文が表示されます。
[Request_ResourceNotFound] : Resource '<指定したユーザープリンシパル名>' does not exist or one of its queried reference-property objects are not present.
リセットしようとしたパスワードが、Microsoft Entra IDのパスワードポリシーに違反している
パスワードを指定してリセットした場合、Microsoft Entra IDのパスワードポリシーによりパスワードのリセットに失敗する場合があります。この場合は以下のエラー文が表示されます。
[Request_BadRequest] : The specified password does not comply with password complexity requirements. Please provide a different password.
パスワードポリシーを無視してパスワードをリセットしたい場合は、ユーザーのパスワードポリシーを一時的に変更してパスワードをリセットすることも可能です。その場合は、Microsoft Graphに接続する箇所およびユーザー情報を更新する箇所を修正してください。
<省略>
# Microsoft Graphに接続します (未接続の場合)
if (-not (Get-MgContext)) {
Write-Host "Microsoft Graphに接続します..." -ForegroundColor Yellow
# 必要なアクセス許可スコープを指定して接続
Connect-MgGraph -Scopes "User.ReadWrite.All,User-PasswordProfile.ReadWrite.All"
}
<省略>
# パスワードリセットの実行
$passwordProfile = @{
ForceChangePasswordNextSignIn = $forceChangeOnNextSignIn
Password = $newPassword
}
Update-MgUser -UserId $upn -PasswordPolicies "DisableStrongPassword" -ErrorAction Stop
Update-MgUser -UserId $upn -PasswordProfile $passwordProfile -ErrorAction Stop
Update-MgUser -UserId $upn -PasswordPolicies None -ErrorAction Stop
<省略>
Microsoft Entra IDの運用上パスワードを無期限にしたい場合は、パスワードリセット処理後のパスワードポリシー(-PasswordPolicies
)をNone
から"DisablePasswordExpiration"
に修正してください。
まとめ
今回は、CSVファイルを利用してMicrosoft Entra IDのユーザーパスワードを一括リセットするPowerShellスクリプトを紹介しました。
Microsoft Entra IDのアカウント管理に活用していただけると幸いです。