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.4 の
AvailableUpdates=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サポートサイトで最新ファームウェアを入手し適用 |
ConfidenceLevelがLowまたは不在 |
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の場合、回復キーが以下のいずれかに保管されていることを必ず確認:
- 個人Microsoftアカウント: https://aka.ms/myrecoverykey
- 組織のEntra ID(旧Azure AD)
- 印刷物・USBファイル
【付録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判定(経過観察)の場合
やること …
- ステップ5のモニタリングスクリプトを保存
- タスクスケジューラに登録(任意)
- Windows Updateを毎月適用
- 月1回モニタリングログを確認
-
Has2023BootMgr = Trueになったら完了

🔴 C判定(要対応)の場合
やること …
- ステップ6でエラー原因を特定
- 該当する対処を実施
- 対処後にステップ1から再判定
本書の手順で UEFICA2023Status、KEK/db、Boot Manager署名、Event ID 1808 を確認し、未完了の場合は以下を実施してください:
- Windows Updateの適用
- 再起動の実施
- OEMファームウェアの最新化
- 管理者による展開判断(エンタープライズ環境の場合)
多くの一般的なWindowsデバイスでは、Windows Updateと再起動を通じて段階的に移行が進む設計です。ただし、ファームウェアの制約、OEM対応状況、管理ポリシー、対象バケットによっては手動対応が必要になる場合があります。Microsoftも「アクションが必要になる場合がある」と明示しています。
不安な場合は本書のモニタリング体制を構築し、自分の目で進捗を観察するのが最も確実な対処法です。
参考文献(Microsoft公式)
本手順書の根拠となるMicrosoft公式ドキュメント:
- Secure Boot Certificate updates: Guidance for IT professionals and organizations
- Windows セキュア ブート証明書の有効期限と CA 更新プログラム
- Registry key updates for Secure Boot: Windows devices with IT-managed updates
- Secure Boot DB and DBX variable update events
- Secure Boot troubleshooting guide
- How to manage the Windows Boot Manager revocations for Secure Boot changes associated with CVE-2023-24932
Discussion