🛡️

Secure Boot 2023移行、自分のPCはどこまで対応してる? PowerShellで確認する方法

に公開

Secure Boot 2023移行、自分のPCはどこまで対応してる? PowerShellで確認する方法

はじめに

ある日、コンサルタントの方から「2026年にWindowsが起動できなくなる」という話を聞きました。Secure Bootの証明書期限切の件らしいんですが、本当にそんなことが起きるのか半信半疑で…😧

Microsoftの公式ドキュメントを読んでみると、意外と「起動できなくなる」とは書かれていません。「新しい初期ブート保護の更新を受けられなくなる可能性がある」という表現にはなっています。これでもよくわからない🤔

「では自分のマシンは今どうなっているのか?」を実機で確認したくなり、PowerShellでチェックする手順を整理したのが本記事です。確認は段階的に行い、結果次第で何もしなくていいのか、継続観察すればいいのか、能動的な対応が必要なのかを判定できるようにしました。

関連証明書の期限(重要)

Microsoft公式情報による2026年に期限を迎える証明書は以下の3つで、6月から10月にかけて段階的に期限を迎えます。

証明書 期限
Microsoft Corporation KEK CA 2011 2026年6月24日
Microsoft UEFI CA 2011 2026年6月27日
Microsoft Windows Production PCA 2011 2026年10月19日

実行時の注意

  • ステップ1〜4 は基本的に状態確認が目的ですが、EFIシステムパーティション(ESP)の一時マウントを行います。
  • ステップ5以降 はログファイル作成、タスクスケジューラ登録などの軽微なシステム変更を伴います。
  • ステップ6.4AvailableUpdates=0x5944明確なシステム変更を伴うため、VM等での事前検証が必要です。

この手順書の使い方

各ステップは「コマンド → 期待される出力 → 判定表次に取るべきアクション」のセットで構成されています。判定結果次第で次のステップに進む / 終了するため、必要以上の作業はしません。

最終的な3つの結論パターン

🟢 A. 完全完了 … 何もする必要なし。Windows Updateを通常通り当てていれば現状維持
🟡 B. 経過観察 … 進行中。月例パッチを当て続けつつ、月1回モニタリングで進捗確認
🔴 C. 要対応 … 何らかの問題があり、能動的なアクションが必要

全体フロー


前提条件

  • 管理者権限でPowerShellを起動できること
  • Secure Boot有効のUEFI機(レガシーBIOS機は対象外)
  • Windows 10 22H2 / Windows 11 / Windows Server 2022以降(今回はWindows11にて確認)

【ステップ1】環境前提チェック

1.1 実行コマンド

管理者権限のPowerShellで以下を実行します。

# Secure Boot有効性
$sb = $null
try { $sb = Confirm-SecureBootUEFI } catch {}

# OS・ファームウェア情報
$os = Get-ComputerInfo | Select-Object WindowsProductName, OsBuildNumber, BiosFirmwareType, BiosManufacturer, BiosName, BiosVersion

# 結果まとめ
[PSCustomObject]@{
    SecureBoot = $sb
    OSBuild = $os.OsBuildNumber
    FirmwareType = $os.BiosFirmwareType
    BIOS = "$($os.BiosManufacturer) $($os.BiosName) $($os.BiosVersion)"
    Architecture = $env:PROCESSOR_ARCHITECTURE
} | Format-List

1.2 判定表

SecureBootの値 FirmwareType 判定 アクション
True Uefi ✅ 続行 ステップ2へ進む
False Uefi ⚠️ Secure Boot無効 本書の対象外。BIOS設定で有効化してから再実行
エラー / null Bios ❌ 対象外 レガシーBIOS機。本書は適用不可(買い替え検討)
エラー / null Uefi ❌ Cmdlet非対応 OSが古い。Windows 10 22H2以降に更新が必要

OSBuildNumberの参考値

Build OS
19045 Windows 10 22H2(対応下限)
22631 Windows 11 23H2
26100 Windows 11 24H2
26200 Windows 11 25H2

これ未満なら、OSのアップグレードが先決です。


【ステップ2】UEFI証明書登録状況の確認

ここが最も重要な判定ポイントとなります。

2.1 確認用関数の準備

以下の関数をPowerShellに貼り付けて定義します(実行するだけで何も書き換えません):

function Show-SecureBootCertificates {
    param([ValidateSet('PK','KEK','db','dbx')][string]$VariableName)

    Write-Host ""
    Write-Host "===== $VariableName =====" -ForegroundColor Cyan
    $var = Get-SecureBootUEFI -Name $VariableName
    $bytes = $var.Bytes
    Write-Host "Total bytes: $($bytes.Length)"

    $x509Guid = [byte[]](0xa1,0x59,0xc0,0xa5,0xe4,0x94,0xa7,0x4a,0x87,0xb5,0xab,0x15,0x5c,0x2b,0xf0,0x72)

    $offset = 0
    while ($offset + 28 -le $bytes.Length) {
        $listSize = [BitConverter]::ToUInt32($bytes, $offset + 16)
        $headerSize = [BitConverter]::ToUInt32($bytes, $offset + 20)
        $sigSize = [BitConverter]::ToUInt32($bytes, $offset + 24)

        $isX509 = $true
        for ($i = 0; $i -lt 16; $i++) {
            if ($bytes[$offset + $i] -ne $x509Guid[$i]) { $isX509 = $false; break }
        }

        if ($listSize -le 28 -or $listSize -gt ($bytes.Length - $offset)) { break }

        if ($isX509) {
            $cursor = $offset + 28 + $headerSize
            while ($cursor + $sigSize -le $offset + $listSize) {
                $certBytes = New-Object byte[] ($sigSize - 16)
                [Array]::Copy($bytes, $cursor + 16, $certBytes, 0, $sigSize - 16)
                try {
                    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2(,$certBytes)
                    Write-Host "  [Cert]" -ForegroundColor Green
                    Write-Host "    Subject  : $($cert.Subject)"
                    Write-Host "    NotBefore: $($cert.NotBefore)"
                    Write-Host "    NotAfter : $($cert.NotAfter)"
                    Write-Host "    Thumbprint: $($cert.Thumbprint)"
                } catch {
                    Write-Host "  [Cert] パース失敗" -ForegroundColor Red
                }
                $cursor += $sigSize
            }
        }
        $offset += $listSize
    }
}

2.2 実行コマンド

Show-SecureBootCertificates -VariableName KEK
Show-SecureBootCertificates -VariableName db

2.3 確認すべき証明書のリスト

KEKに含まれるべき証明書

検出された証明書 意味
Microsoft Corporation KEK CA 2011 2011版(既存)
Microsoft Corporation KEK CA 2023 または Microsoft Corporation KEK 2K CA 2023 2023版(後継)
OEM名(Dell / HP / Lenovo / Dynabook 等)の KEK CA OEM独自証明書(正常)

dbに含まれるべき証明書

検出された証明書 意味
Microsoft Windows Production PCA 2011 2011版(既存)
Microsoft Corporation UEFI CA 2011 2011版サードパーティ(既存)
Windows UEFI CA 2023 2023版(後継)
Microsoft UEFI CA 2023 2023版サードパーティ(後継)
Microsoft Option ROM UEFI CA 2023 2023版オプションROM(後継)
OEM名の Utility CA など OEM独自証明書(正常)

2.4 判定表

KEKに2023系 dbに2023系 判定 次のステップ
✅ あり ✅ あり 🟢 証明書展開済み ステップ3へ
❌ なし ✅ あり 🟡 部分展開(KEK遅延) ステップ4へ
✅ あり ❌ なし 🟡 部分展開(db遅延) ステップ4へ
❌ なし ❌ なし 🔴 未展開 ステップ4へ

【ステップ3】起動中のBoot Manager署名を確認

ステップ2でKEK/db両方に2023系が入っていた場合のみ実施します。

3.1 実行コマンド

mountvol S: /S
$sig = Get-AuthenticodeSignature -FilePath "S:\EFI\Microsoft\Boot\bootmgfw.efi"
mountvol S: /D

[PSCustomObject]@{
    BootMgrSubject = $sig.SignerCertificate.Subject
    BootMgrIssuer = $sig.SignerCertificate.Issuer
    BootMgrNotAfter = $sig.SignerCertificate.NotAfter
    Has2023BootMgr = $sig.SignerCertificate.Issuer -like "*2023*"
    SignatureStatus = $sig.Status
} | Format-List

3.2 判定表

BootMgrIssuerの値 Has2023BootMgr SignatureStatus 判定 次のアクション
CN=Windows UEFI CA 2023, ... True Valid 🟢 A. 完全移行完了 何もしなくてOK。Windows Updateを通常通り。本書はここで終了
CN=Microsoft Windows Production PCA 2011, ... False Valid 🟡 本体置換待ち ステップ4へ
いずれか いずれか Valid以外 🔴 署名異常 sfc /scannowを実行後、本ステップを再実施

【ステップ4】Microsoftによる配信判定状態の確認

ステップ2/3で何らかの未完了状態だった場合に実施します。

4.1 実行コマンド

$path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing"

if (Test-Path $path) {
    Get-ItemProperty -Path $path | Select-Object * -ExcludeProperty PS* | Format-List
} else {
    Write-Host "Servicingキー未作成" -ForegroundColor Yellow
}

4.2 主要な値の意味

キー名 意味
WindowsUEFICA2023Capable 参考値(状態確認には UEFICA2023Status を使うことをMicrosoftが推奨)。値の意味:0/未存在=Windows UEFI CA 2023がDBにない、1=DBにある、2=DBにあり、かつ2023署名Boot Managerから起動している
UEFICA2023Status 状態確認の正式な指標。証明書展開の進捗状態(Updated / NotStarted / InProgress / Failed)
ConfidenceLevel デバイスが属する更新バケットの信頼度・観測状態
ConfidenceUpdateType 適用予定のアクション種別(22852 = 0x5944 = High Confidence update)
BucketHash 機種・構成の識別ハッシュ
LastParsedBucketDataVersion バケット定義の世代番号
RebootRequestedDB DB更新後の再起動要求履歴
RebootRequestedKEK KEK更新後の再起動要求履歴
RebootRequestedBootManager Boot Manager置換後の再起動要求履歴(重要)
AvailableUpdates 現在保留中の更新アクション(ビットマスク)。内訳:0x0040=Windows UEFI CA 2023 DB追加、0x0800=Microsoft Option ROM UEFI CA 2023、0x1000=Microsoft UEFI CA 2023、0x0004=KEK、0x0100=Windows UEFI CA 2023署名Boot Manager適用
UEFICA2023Error エラー発生時のエラーコード

4.3 ConfidenceLevelの解釈

デバイスが属する更新バケットの信頼度・観測状態を示します。Microsoft公式で示されている代表的な値

意味
High Confidence Microsoftが検証済み・自動配信対象。月例パッチで自動的に進行
Under Observation - More Data Needed 観測中、データ収集段階
Temporarily Paused 一時停止中
Not Supported – Known Limitation 既知の制約により非対応
No Data Observed - Action Required データ未観測、管理者対応が必要

4.4 結果パターンと判定

ConfidenceLevel UEFICA2023Status UEFICA2023Error Has2023BootMgr (Step3) 判定 アクション
High Confidence Updated なし True 🟢 A. 完全完了 何もしなくてOK。本書終了
High Confidence Updated なし False 🟡 B. 経過観察 ステップ5でモニタリング体制を整え、Windows Update継続
Under Observation等 Updated なし False 🟡 B. 経過観察 ステップ5でモニタリング体制を整え、Windows Update継続
任意 NotStarted / 不在 なし False 🟡 B. 配信待ち ステップ5でモニタリング体制を整え、Windows Update履歴を確認
Temporarily Paused 任意 なし False 🟡 B. 一時停止中 Microsoftが配信を一時停止中。継続観察
Not Supported – Known Limitation 任意 任意 False 🔴 C. 既知の制約 ステップ6へ。OEMファームウェア対応待ちの可能性
No Data Observed - Action Required 任意 任意 False 🔴 C. 管理者対応必要 ステップ6へ
任意 Failed 0以外 False 🔴 C. エラー ステップ6へ
キー自体が存在しない - - - 🔴 C. 未対応OS OSを最新の累積更新まで適用

【ステップ5】モニタリング体制の構築(B判定の場合)

ステップ4で🟡B判定が出た場合、移行完了までの進捗を継続的に観察するための仕組みを整えます。月1回程度の頻度でチェックすることで、Boot Manager置換が来たタイミングを正確に把握できます。

5.1 モニタリングスクリプトの作成

以下のスクリプトを secureboot_monitor.ps1 として、適切な場所(例:%USERPROFILE%\Scripts\)に保存します。

# secureboot_monitor.ps1
# Secure Boot 2023移行状態のモニタリング

$path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing"

mountvol S: /S 2>$null
$sig = Get-AuthenticodeSignature "S:\EFI\Microsoft\Boot\bootmgfw.efi"
mountvol S: /D 2>$null

$regProps = Get-ItemProperty $path -ErrorAction SilentlyContinue

$snapshot = [PSCustomObject]@{
    Date              = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    BootMgrIssuer     = $sig.SignerCertificate.Issuer.Split(',')[0]
    BootMgrNotAfter   = $sig.SignerCertificate.NotAfter.ToString("yyyy-MM-dd")
    Has2023BootMgr    = $sig.SignerCertificate.Issuer -like "*2023*"
    UEFICA2023Status  = $regProps.UEFICA2023Status
    ConfidenceLevel   = $regProps.ConfidenceLevel
    RebootBM          = $regProps.RebootRequestedBootManager
    Error             = $regProps.UEFICA2023Error
}

# CSVログに追記
$logPath = "$env:USERPROFILE\Documents\secureboot_log.csv"
$snapshot | Export-Csv -Path $logPath -Append -NoTypeInformation -Encoding UTF8

# 画面表示
Write-Host ""
Write-Host "===== Secure Boot 移行状態スナップショット =====" -ForegroundColor Cyan
$snapshot | Format-List

# 完了判定
if ($snapshot.Has2023BootMgr) {
    Write-Host "🟢 Boot Manager 2023移行 完了!" -ForegroundColor Green
} elseif ($snapshot.RebootBM -eq 1) {
    Write-Host "🟡 Boot Manager置換ステージング中。再起動で完了予定" -ForegroundColor Yellow
} else {
    Write-Host "🟡 経過観察中。Boot Manager置換は未配信" -ForegroundColor Yellow
}

Write-Host ""
Write-Host "ログファイル: $logPath" -ForegroundColor Gray

5.2 状態遷移の予想

このスクリプトを継続実行することで、以下の遷移を観察できます:

観測時期 Has2023BootMgr RebootBM 状態の意味
現在(B判定時) False (空) 証明書展開済み・Boot Manager置換未配信
中間段階 False 1 Boot Manager置換が要求された・再起動待ち
再起動後 True 1 完全移行完了 🎉

5.3 タスクスケジューラへの登録(自動化)

毎月手動実行するのが面倒な場合、タスクスケジューラに登録します。

管理者権限のPowerShellで以下を実行

# スクリプトパスを適宜変更
$scriptPath = "$env:USERPROFILE\Scripts\secureboot_monitor.ps1"

$action = New-ScheduledTaskAction `
    -Execute "PowerShell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`""

# 毎月1日の朝9時に実行
$trigger = New-ScheduledTaskTrigger -Once -At "09:00" `
    -RepetitionInterval (New-TimeSpan -Days 30)

$principal = New-ScheduledTaskPrincipal `
    -UserId "$env:USERDOMAIN\$env:USERNAME" `
    -RunLevel Highest

$settings = New-ScheduledTaskSettingsSet `
    -StartWhenAvailable `
    -DontStopOnIdleEnd

Register-ScheduledTask `
    -TaskName "SecureBoot2023Monitor" `
    -Action $action `
    -Trigger $trigger `
    -Principal $principal `
    -Settings $settings `
    -Description "Secure Boot 2023証明書移行状態の月次モニタリング"

⚠️New-ScheduledTaskTrigger-Monthlyオプションを直接サポートしないため、-Once-RepetitionIntervalの組み合わせで30日周期を実現しています。確実に毎月1日に実行したい場合は、schtasks.exeを使う方法もあります:

schtasks /Create /SC MONTHLY /D 1 /TN "SecureBoot2023Monitor" /TR "PowerShell.exe -NoProfile -ExecutionPolicy Bypass -File %USERPROFILE%\Scripts\secureboot_monitor.ps1" /ST 09:00 /RL HIGHEST /F

タスクを削除したい場合

Unregister-ScheduledTask -TaskName "SecureBoot2023Monitor" -Confirm:$false

5.4 ログの確認

蓄積されたモニタリングログを確認

# 全履歴を表示
Import-Csv "$env:USERPROFILE\Documents\secureboot_log.csv" | Format-Table -AutoSize

# 状態変化のあった時点だけ抽出
$log = Import-Csv "$env:USERPROFILE\Documents\secureboot_log.csv"
$log | Where-Object {
    $_.Has2023BootMgr -ne $log[0].Has2023BootMgr -or
    $_.RebootBM -ne $log[0].RebootBM
} | Format-Table -AutoSize

5.5 確認をやめるタイミング判断

モニタリングは以下のいずれかの条件で終了して問題ありません。

  • Has2023BootMgr = True が確認できた(=Boot Manager 2023署名版に置換完了)
  • ✅ Event ID 1808 が確認できた(=必要な証明書が適用され、Boot ManagerもWindows UEFI CA 2023署名版に更新された完全更新状態)

👉️単に2026年10月を過ぎても起動できているだけでは、移行完了とは判断しません。Microsoftは「新しい2023証明書を受け取っていないデバイスでも通常起動や標準のWindows Updateは継続できる一方、Boot ManagerやSecure Boot DB/DBXなど初期ブート保護の新しい更新を受けられなくなる可能性がある」と説明しています。「起動できていること」と「Secure Boot 2023移行が完了していること」は別です。

完了したらタスクをUnregisterすれば終わりです。


【ステップ6】トラブルシューティング(C判定の場合)

ステップ4で🔴C判定が出た場合のみ実施します。

6.1 Windows Update履歴の確認

# 直近30日のWindows Update適用履歴
Get-WinEvent -FilterHashtable @{
    LogName='System'
    ProviderName='Microsoft-Windows-WindowsUpdateClient'
    StartTime=(Get-Date).AddDays(-30)
} -ErrorAction SilentlyContinue |
    Where-Object { $_.Id -in 19,20,43,44 } |
    Select-Object TimeCreated, Id, LevelDisplayName, Message |
    Format-List

6.2 TPM関連イベントログの確認

Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='*TPM*'} -MaxEvents 30 -ErrorAction SilentlyContinue |
    Select-Object TimeCreated, Id, ProviderName, Message |
    Format-List

特に Event ID 1808 は、必要なSecure Boot 2023証明書がファームウェアに適用され、Boot ManagerもWindows UEFI CA 2023署名版に更新された「完全更新済み」状態を示します。これが確認できれば移行完了と判断できます。

6.3 アクション一覧

症状 対応
Windows Updateがしばらく当たっていない 「設定 → Windows Update → 更新プログラムのチェック」を実行
UEFICA2023Errorに値あり エラーコードを記録し、Microsoft Supportで照合
OEMファームウェアが古い OEMサポートサイトで最新ファームウェアを入手し適用
ConfidenceLevelLowまたは不在 OEMファームウェア最新化を最優先で実施
すべて正常だが進まない 直近の月例パッチ(次のPatch Tuesday)まで待機

6.4 【最終手段】強制適用(非推奨)

通常は不要ですが、特殊な事情がある場合のみ行います。

レジストリパス: HKLM\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing
値名: AvailableUpdates (REG_DWORD)
値: 0x5944

設定後に再起動2〜3回を経て、ステップ2〜4で正常に進行したか確認します。


アクション早見表

出力パターン 判定 やること
🟢 KEK/dbに2023系、Boot Managerも2023署名、Event 1808確認済み A 何もしない。Windows Updateを通常通り
🟡 KEK/dbに2023系、Boot Managerは2011署名、UEFICA2023Status=Updated、エラーなし B ステップ5でモニタリング設定、Windows Update継続
🟡 KEK/dbのどちらか片方のみ2023系、エラーなし B ステップ5でモニタリング設定、Windows Update継続
🟡 KEK/dbに2023系なし、ConfidenceLevel=High Confidence、エラーなし B ステップ5でモニタリング設定、次の月例パッチを待つ
🟡 ConfidenceLevel=Temporarily Paused B Microsoftが配信を一時停止中。ステップ5でモニタリング設定、再開を待つ
🟡 ConfidenceLevel=Under Observation - More Data Needed B データ収集段階。ステップ5でモニタリング設定、判定確定を待つ
🔴 UEFICA2023Errorに値あり C ステップ6:エラーコードをMicrosoft Supportで照合
🔴 ConfidenceLevel=Not Supported – Known Limitation C ステップ6:OEMファームウェア最新化を実施
🔴 ConfidenceLevel=No Data Observed - Action Required C ステップ6:管理者対応が必要
🔴 Servicingキー自体が存在しない C ステップ6:OSの累積更新を最新まで適用

BitLockerに関する補足

BitLockerが有効な機器では、db/KEK更新時に回復キー要求が発生する可能性があります。本書の手順実施前に確認しておくと安心です。

BitLocker状態の確認

Get-BitLockerVolume -MountPoint C: | Select-Object MountPoint, ProtectionStatus

ProtectionStatus = Onの場合、回復キーが以下のいずれかに保管されていることを必ず確認:


【付録A】一括チェックスクリプト(ステップ1〜4統合版)

以下を secureboot_check.ps1 として保存し、管理者PowerShellで実行すると全ステップを自動判定します。

# secureboot_check.ps1
# Secure Boot 2023移行状態 一括チェックスクリプト

Write-Host "=================================================" -ForegroundColor Cyan
Write-Host " Secure Boot 2023移行状態チェック" -ForegroundColor Cyan
Write-Host " 実行日時: $(Get-Date)" -ForegroundColor Cyan
Write-Host "=================================================" -ForegroundColor Cyan

# ステップ1:環境前提
Write-Host ""
Write-Host "[Step 1] 前提環境" -ForegroundColor Yellow
$sb = $null
try { $sb = Confirm-SecureBootUEFI } catch {
    Write-Host "  ❌ Secure Boot非対応またはレガシーBIOS" -ForegroundColor Red
    exit 1
}
if (-not $sb) {
    Write-Host "  ⚠️ Secure Boot無効。BIOSで有効化してください" -ForegroundColor Yellow
    exit 1
}
$os = Get-ComputerInfo
Write-Host "  ✅ Secure Boot有効"
Write-Host "  OS Build: $($os.OsBuildNumber)"
Write-Host "  BIOS: $($os.BiosManufacturer) $($os.BiosVersion)"

# ステップ2:証明書登録状況
Write-Host ""
Write-Host "[Step 2] UEFI証明書登録状況" -ForegroundColor Yellow

function Get-SBCerts {
    param([string]$Name)
    $var = Get-SecureBootUEFI -Name $Name
    $bytes = $var.Bytes
    $x509Guid = [byte[]](0xa1,0x59,0xc0,0xa5,0xe4,0x94,0xa7,0x4a,0x87,0xb5,0xab,0x15,0x5c,0x2b,0xf0,0x72)
    $offset = 0
    $certs = @()
    while ($offset + 28 -le $bytes.Length) {
        $listSize = [BitConverter]::ToUInt32($bytes, $offset + 16)
        $headerSize = [BitConverter]::ToUInt32($bytes, $offset + 20)
        $sigSize = [BitConverter]::ToUInt32($bytes, $offset + 24)
        $isX509 = $true
        for ($i = 0; $i -lt 16; $i++) { if ($bytes[$offset+$i] -ne $x509Guid[$i]) { $isX509=$false; break } }
        if ($listSize -le 28 -or $listSize -gt ($bytes.Length - $offset)) { break }
        if ($isX509) {
            $cursor = $offset + 28 + $headerSize
            while ($cursor + $sigSize -le $offset + $listSize) {
                $certBytes = New-Object byte[] ($sigSize - 16)
                [Array]::Copy($bytes, $cursor + 16, $certBytes, 0, $sigSize - 16)
                try { $certs += New-Object System.Security.Cryptography.X509Certificates.X509Certificate2(,$certBytes) } catch {}
                $cursor += $sigSize
            }
        }
        $offset += $listSize
    }
    return $certs
}

$kekCerts = Get-SBCerts -Name KEK
$dbCerts = Get-SBCerts -Name db

$kekHas2023 = ($kekCerts | Where-Object { $_.Subject -like "*2023*" }).Count -gt 0
$dbHas2023 = ($dbCerts | Where-Object { $_.Subject -like "*2023*" }).Count -gt 0

Write-Host "  KEK ($($kekCerts.Count)件):"
$kekCerts | ForEach-Object { Write-Host "    - $($_.Subject.Split(',')[0])" }
Write-Host "  db ($($dbCerts.Count)件):"
$dbCerts | ForEach-Object { Write-Host "    - $($_.Subject.Split(',')[0])" }
Write-Host ""
Write-Host "  KEK 2023系: $kekHas2023" -ForegroundColor $(if($kekHas2023){"Green"}else{"Red"})
Write-Host "  db  2023系: $dbHas2023"  -ForegroundColor $(if($dbHas2023){"Green"}else{"Red"})

# ステップ3:Boot Manager署名
Write-Host ""
Write-Host "[Step 3] Boot Manager署名" -ForegroundColor Yellow
mountvol S: /S 2>$null
$sig = Get-AuthenticodeSignature "S:\EFI\Microsoft\Boot\bootmgfw.efi"
mountvol S: /D 2>$null
$bmIssuer = $sig.SignerCertificate.Issuer
$bmHas2023 = $bmIssuer -like "*2023*"
Write-Host "  Issuer: $bmIssuer"
Write-Host "  NotAfter: $($sig.SignerCertificate.NotAfter)"
Write-Host "  Boot Manager 2023: $bmHas2023" -ForegroundColor $(if($bmHas2023){"Green"}else{"Yellow"})

# ステップ4:レジストリ状態
Write-Host ""
Write-Host "[Step 4] Microsoft配信判定状態" -ForegroundColor Yellow
$path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing"
$reg = $null
if (Test-Path $path) {
    $reg = Get-ItemProperty -Path $path
    Write-Host "  ConfidenceLevel: $($reg.ConfidenceLevel)"
    Write-Host "  UEFICA2023Status: $($reg.UEFICA2023Status)"
    Write-Host "  WindowsUEFICA2023Capable: $($reg.WindowsUEFICA2023Capable)"
    Write-Host "  RebootRequestedBootManager: $($reg.RebootRequestedBootManager)"
    if ($reg.UEFICA2023Error) {
        Write-Host "  UEFICA2023Error: 0x$([Convert]::ToString($reg.UEFICA2023Error,16))" -ForegroundColor Red
    } else {
        Write-Host "  UEFICA2023Error: なし" -ForegroundColor Green
    }
} else {
    Write-Host "  ⚠️ Servicingキー未作成" -ForegroundColor Yellow
}

# 最終判定
Write-Host ""
Write-Host "=================================================" -ForegroundColor Cyan
Write-Host " 最終判定" -ForegroundColor Cyan
Write-Host "=================================================" -ForegroundColor Cyan

if ($reg.UEFICA2023Error) {
    Write-Host "🔴 C. 要対応:エラー検出。ステップ6へ" -ForegroundColor Red
} elseif ($kekHas2023 -and $dbHas2023 -and $bmHas2023) {
    Write-Host "🟢 A. 完全移行完了。追加作業不要" -ForegroundColor Green
    Write-Host "   → Windows Updateを通常通り当て続けてください" -ForegroundColor Green
} elseif ($kekHas2023 -and $dbHas2023 -and -not $bmHas2023) {
    Write-Host "🟡 B. 証明書展開済み・Boot Manager置換待ち" -ForegroundColor Yellow
    Write-Host "   → ステップ5でモニタリング体制を構築してください" -ForegroundColor Yellow
    Write-Host "   → Windows Update継続" -ForegroundColor Yellow
} elseif (-not ($kekHas2023 -and $dbHas2023)) {
    switch -Wildcard ($reg.ConfidenceLevel) {
        "High Confidence" {
            Write-Host "🟡 B. 自動配信対象・到達待ち" -ForegroundColor Yellow
            Write-Host "   → ステップ5でモニタリング体制を構築してください" -ForegroundColor Yellow
            Write-Host "   → Windows Update継続" -ForegroundColor Yellow
        }
        "Under Observation*" {
            Write-Host "🟡 B. 観測中・データ収集段階" -ForegroundColor Yellow
            Write-Host "   → ステップ5でモニタリング体制を構築してください" -ForegroundColor Yellow
        }
        "Temporarily Paused" {
            Write-Host "🟡 B. 配信一時停止中" -ForegroundColor Yellow
            Write-Host "   → ステップ5でモニタリング体制を構築、配信再開を待つ" -ForegroundColor Yellow
        }
        "Not Supported*" {
            Write-Host "🔴 C. 既知の制約により非対応" -ForegroundColor Red
            Write-Host "   → OEMファームウェア最新化を確認後、ステップ6へ" -ForegroundColor Red
        }
        "No Data Observed*" {
            Write-Host "🔴 C. 管理者対応が必要" -ForegroundColor Red
            Write-Host "   → ステップ6で対応を検討" -ForegroundColor Red
        }
        default {
            Write-Host "🔴 C. 配信対象外または未開始" -ForegroundColor Red
            Write-Host "   → ConfidenceLevel: $($reg.ConfidenceLevel)" -ForegroundColor Red
            Write-Host "   → ステップ6で対応を検討" -ForegroundColor Red
        }
    }
}
Write-Host ""

【付録B】実機検証例(Intel 12th gen ノートPC / Windows 11 25H2)

本手順を実機で実行した例です。

ステップ1結果

  • SecureBoot: True
  • OSBuild: 26200(Windows 11 25H2)
  • FirmwareType: Uefi
  • BIOS: Intel 12th gen ノートPC(最新ファームウェア適用済み)
  • Architecture: AMD64

ステップ2結果

  • KEK(3件): Microsoft KEK CA 2011, OEM KEK CA 2019, Microsoft KEK 2K CA 2023
  • db(3件): Microsoft Windows Production PCA 2011, OEM Utility CA 2019, Windows UEFI CA 2023

ステップ3結果

  • BootMgrIssuer: CN=Microsoft Windows Production PCA 2011
  • Has2023BootMgr: False
  • SignatureStatus: Valid

ステップ4結果

  • WindowsUEFICA2023Capable: 2
  • UEFICA2023Status: Updated
  • ConfidenceLevel: High Confidence
  • UEFICA2023Error: なし
  • RebootRequestedBootManager: なし

最終判定

🟡 B. 経過観察 ─ ステップ5でモニタリング設定、Windows Update継続

このパターンはMicrosoftの段階移行プロセスが正常に進行している途中段階の実例です。「Windowsが起動できなくなる」という単純な言説への実機ベースの参考データとして提示します(移行完了まではまだ追加の段階が必要であることに注意)。

イベントログには Event ID 1808 が記録されており、UpdateType フィールドに Windows UEFI CA 2023 (DB), Option ROM CA 2023 (DB), 3P UEFI CA 2023 (DB), KEK 2023, Boot Manager (2023) が列挙されていました。証明書の展開は完了しているものの、Boot Manager本体のファイル置換はまだ未配信、という段階展開の中間状態が観察できます。


【まとめ】判定別の対応指針

🟢 A判定(完全完了)の場合

やること … 何もしない。Windows Updateを通常通り当てる。

🟡 B判定(経過観察)の場合

やること …

  1. ステップ5のモニタリングスクリプトを保存
  2. タスクスケジューラに登録(任意)
  3. Windows Updateを毎月適用
  4. 月1回モニタリングログを確認
  5. Has2023BootMgr = True になったら完了

🔴 C判定(要対応)の場合

やること …

  1. ステップ6でエラー原因を特定
  2. 該当する対処を実施
  3. 対処後にステップ1から再判定

本書の手順で UEFICA2023Status、KEK/db、Boot Manager署名、Event ID 1808 を確認し、未完了の場合は以下を実施してください:

  • Windows Updateの適用
  • 再起動の実施
  • OEMファームウェアの最新化
  • 管理者による展開判断(エンタープライズ環境の場合)

多くの一般的なWindowsデバイスでは、Windows Updateと再起動を通じて段階的に移行が進む設計です。ただし、ファームウェアの制約、OEM対応状況、管理ポリシー、対象バケットによっては手動対応が必要になる場合があります。Microsoftも「アクションが必要になる場合がある」と明示しています。

不安な場合は本書のモニタリング体制を構築し、自分の目で進捗を観察するのが最も確実な対処法です。


参考文献(Microsoft公式)

本手順書の根拠となるMicrosoft公式ドキュメント:

Discussion