Skip to content

fix(windows): UCPD が保護するタスクバー設定値の拒否で apply が中断しないようにする - #69

Merged
msageha merged 1 commit into
mainfrom
fix/windows-ucpd-taskbar-registry
Aug 19, 2026
Merged

fix(windows): UCPD が保護するタスクバー設定値の拒否で apply が中断しないようにする#69
msageha merged 1 commit into
mainfrom
fix/windows-ucpd-taskbar-registry

Conversation

@msageha

@msageha msageha commented Aug 19, 2026

Copy link
Copy Markdown
Owner

概要

Windows 11 の User Choice Protection Driver (UCPD.sys) が保護する 2 つのタスクバー設定値への書き込みが ACCESS_DENIED になり、chezmoi apply.chezmoiscripts/02_windows.ps1: exit status 1 で中断していた。該当値の拒否のみ警告扱いにして続行する。

UCPD.sys は保護対象の値名へのレジストリ書き込みをカーネルのレジストリコールバックで傍受し、呼び出し元プロセスが deny-list (reg.exe / powershell.exe 等) の場合に ACCESS_DENIED を返す。TaskbarDaShellFeedsTaskbarViewMode がこれに該当するため、スクリプトからは原理的に変更できない (変更には Microsoft 署名バイナリ = 設定アプリが必要)。

変更内容

  • install/windows/system_settings.ps1Set-UcpdProtectedDword を追加し、TaskbarDaShellFeedsTaskbarViewMode の書き込みをそれ経由にした
  • UnauthorizedAccessException のみ警告してスキップし、それ以外の失敗は再スローする ($ErrorActionPreference = 'Stop' 経由で例外が包まれる場合に備え、例外チェーンと FullyQualifiedErrorId の両方で判定)
  • 同ファイルの他のレジストリ書き込みは fail-fast のまま

関連 Issue

なし

動作確認

  • mise run pre-commit が通った (PSScriptAnalyzer 含む全 hook Passed)
  • mise run test が通った (45 ok / 1 not ok。失敗は [common] dotfiles~/.ssh/config 存在チェックで、エージェント sandbox の read deny による既知の偽失敗。sandbox を外して bats tests/files/common.bats を実行すると ok になることを確認済み)
  • mise run dry-run — 未実行。install/home/ 配下ではなく chezmoi の管理対象ファイルではないため apply 差分に現れない。加えて --verbose 付き dry-run は secret ファイルの実値が unified diff に出る経路のため回避した

追加の確認:

  • 分岐ロジックを pwsh 7.6.4 で実行して確認 (New-ItemProperty をスタブ化)。(1) UnauthorizedAccessException → スキップ、(2) 他の例外 → 再スロー、(3) FullyQualifiedErrorId のみ一致 → スキップ の 3 系統が期待どおり
  • 実機 (Windows 11 25H2 / build 26200) で reg addSet-ItemProperty の両方が該当 2 値のみ拒否し、同キーの TaskbarMn / ShowCopilotButton / IsBatteryPercentageEnabled / ShowSecondsInSystemClock は成功することを確認

チェックリスト

  • テストを追加・更新した — 追加なし。リポジトリに PowerShell のテストハーネスが無く、新設は本 PR のスコープ外のため、上記の pwsh 実行で代替した
  • ドキュメントを更新した — 不要
  • 破壊的変更が含まれる場合、その影響範囲を明記した — 破壊的変更なし

補足情報

UCPD.sys の deny-list と参照レジストリ値の解析: https://kolbi.cz/blog/2024/04/03/userchoice-protection-driver-ucpd-sys/

ウィジェットとニュースを非表示にしたい場合は、設定アプリ (個人用設定 → タスクバー) から手動で行う必要がある。

別件の未解決事項として、同じ端末では root\cimv2 への WMI クエリが WBEM_E_ACCESS_DENIED になり、get.chezmoi.io/ps1 の Windows PowerShell 5.1 経路 (Get-CimInstance Win32_Processor による CPU アーキテクチャ判定) が失敗する。本 PR の対象外。

Windows 11 の User Choice Protection Driver (UCPD.sys) は保護対象の値名への
レジストリ書き込みをカーネルのレジストリコールバックで傍受し、呼び出し元が
deny-list (reg.exe / powershell.exe 等) の場合に ACCESS_DENIED を返す。
TaskbarDa と ShellFeedsTaskbarViewMode がこれに該当するため
system_settings.ps1 が UnauthorizedAccessException で停止し、
run_once_before_02_windows.ps1 が exit 1 となって apply 全体が中断していた。

該当する 2 値のみ Set-UcpdProtectedDword 経由に変更し、拒否は警告して
スキップ、それ以外の失敗は再スローする。これらの値を変更するには
Microsoft 署名バイナリ (設定アプリ) が必要。

実測 (Windows 11 25H2 / build 26200):
- reg add / Set-ItemProperty のいずれでも TaskbarDa と
  ShellFeedsTaskbarViewMode は拒否される
- 同じキーの TaskbarMn / ShowCopilotButton /
  IsBatteryPercentageEnabled / ShowSecondsInSystemClock は成功する
@msageha
msageha enabled auto-merge (squash) August 19, 2026 14:04
@msageha
msageha merged commit 47c78c2 into main Aug 19, 2026
8 checks passed
@msageha
msageha deleted the fix/windows-ucpd-taskbar-registry branch August 19, 2026 14:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant