Microsoft Entra IDのユーザーパスワードを一括リセットする

こんにちは、伊藤です。

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のアカウント管理に活用していただけると幸いです。

参考

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です