朝7時にClaude Codeのブリーフィングが上がってこない。
公募調査のレポートが昨日の夕方分から更新されていない。
SNS状況の集計も、進捗管理タスクの差分メモも、いつもの時間に出ているはずのものが、ことごとく無い。
PCを見にいくと、Windowsはまっさらなロック画面。「更新を構成しました」の余韻もなく、ただ静かに再起動された後の顔をしています。
これは私が直近1ヶ月で何度もやらかしていた状況です。Claude CodeをローカルWindowsで朝・昼・夕・夜の4時間帯に自動実行させていたのに、深夜のWindows Updateが全部潰していく。しかも気づくのは数時間後、その日の予定を立てようとした瞬間です。
この記事では、Windows 11 Home を 「手動以外では一切再起動しない」 状態にするまでの実際の手順を、コピペで動くコマンドベースでまとめます。途中、Claudeと一緒に2段階のハマり方をした経緯も含めて書きます。
この記事でできるようになること
- Windows 11 Home を Claude Code や Python の定期実行ジョブが安定して動く「サーバー的なPC」として運用できる
- 月例の累積更新だけでなく、 機能更新(大型アップグレード) も自分のタイミングまで止められる
- 「また勝手に再起動された」が起きたとき、 何が再起動を発動したか を5分で特定できる
前提環境
- OS: Windows 11 Home バージョン 25H2 (OSビルド 26200.8457)
- エディションは Home で進めます。Pro なら
gpedit.mscから GUI でできる設定が多いですが、ここでは Home でも効くレジストリ方式で統一します - すべて 管理者 PowerShell で実行します(
スタートメニュー → Windows PowerShell を右クリック → 管理者として実行) - Claude Code をはじめ、タスクスケジューラで定期実行している何らかのジョブが回っている前提
第1ラウンド:月例更新からの自動再起動を止める
まずは、いわゆる「Patch Tuesday」型の月例更新が深夜に再起動を発火するのを止めます。ここで4つの対策を入れます。
レジストリ3点セット
$p = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU"
New-Item -Path $p -Force | Out-Null
New-ItemProperty -Path $p -Name NoAutoRebootWithLoggedOnUsers -PropertyType DWORD -Value 1 -Force
New-ItemProperty -Path $p -Name AUOptions -PropertyType DWORD -Value 2 -Force
New-ItemProperty -Path $p -Name AlwaysAutoRebootAtScheduledTime -PropertyType DWORD -Value 0 -Force
gpupdate /force
それぞれの意味は、
NoAutoRebootWithLoggedOnUsers = 1: ログオン中ユーザーがいたら自動再起動しないAUOptions = 2: 自動ダウンロードしない(通知だけ)AlwaysAutoRebootAtScheduledTime = 0: スケジュール時刻の強制再起動を無効
Policies 配下のレジストリは Home でも読まれます。Pro 専用とよく書かれているのですが、実際は動きます。
UpdateOrchestratorのReboot系タスクを無効化
Windowsは内部的に「Reboot」「Reboot_AC」「Reboot_Battery」「Schedule Scan」「USO_UxBroker」といった更新関連のスケジュールタスクを持っています。これを止めます。
$tasks = @(
"\Microsoft\Windows\UpdateOrchestrator\Reboot",
"\Microsoft\Windows\UpdateOrchestrator\Reboot_AC",
"\Microsoft\Windows\UpdateOrchestrator\Reboot_Battery",
"\Microsoft\Windows\UpdateOrchestrator\Schedule Scan",
"\Microsoft\Windows\UpdateOrchestrator\USO_UxBroker"
)
foreach ($t in $tasks) {
schtasks /Change /TN $t /Disable
}
ここで一部のタスクは「アクセスが拒否されました」と出るはずです。TrustedInstaller 所有で、 Administrator でも触れないように保護されているためです。
その場合は タスクXMLそのものをリネームしてしまう のが現実的です。タスクスケジューラはXMLが見つからないとそのタスクを実行できません。
$taskNames = @("Reboot_AC", "Reboot_Battery", "Schedule Scan", "USO_UxBroker")
$base = "C:\Windows\System32\Tasks\Microsoft\Windows\UpdateOrchestrator"
foreach ($n in $taskNames) {
$file = Join-Path $base $n
if (Test-Path $file) {
takeown /F $file
icacls $file /grant "Administrators:F"
Move-Item -Path $file -Destination "$file.disabled_$(Get-Date -Format yyyyMMdd)" -Force
}
}
takeown で所有権を Administrators に移し、icacls でフルアクセスを付与してから、XMLを .disabled_yyyymmdd というサフィックス付きにリネームしています。元に戻したくなったらサフィックスを外すだけです。
WaaSMedicSvcを無効化する
ここまでの設定は、放っておくとWindowsが「壊れた設定」とみなして勝手に治しに来ます。担当しているのが WaaSMedicSvc (Windows Update Medic Service) です。これも止めます。
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc" -Name Start -Value 4
Start = 4 は「Disabled」を意味します。普通の Stop-Service や Set-Service ではアクセス拒否されるので、レジストリ直書きが必要です。これは PC再起動後に有効になります。
BSOD時の自動再起動も止める
サーバー運用なら必須です。ブルースクリーンが出たとき、Windowsはデフォルトで自動再起動して、エラーログを読み損なう状況を作ります。
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl" -Name AutoReboot -Value 0
または GUI で Win+R → sysdm.cpl → 詳細設定 → 起動と回復 → 設定 → 「自動的に再起動する」のチェックを外す でも同じです。
ここで一度安心しかけた、私の話
ここまで設定したところで、私は「これで完了、お疲れさまでした」とClaudeに言われました。実際、レジストリ・タスク・WaaSMedicSvc・BSOD、ありとあらゆる経路を塞いだはずでした。
ところが、翌々日の朝。
朝7時のClaude Codeブリーフィングが上がってこない。PCを開いたら、当然のようにロック画面。 「結局できてねえじゃねえか」 が、その日の最初の感想でした。
ここから第2ラウンドが始まります。
第2ラウンド:イベントログで犯人を特定する
Windowsの「System」イベントログには Event ID 1074 という識別子があり、「誰が、どんな理由で再起動を要求したか」が記録されています。これを引きます。
Get-WinEvent -FilterHashtable @{LogName='System'; ID=1074} -MaxEvents 5 |
ForEach-Object {
[PSCustomObject]@{
日時 = $_.TimeCreated
プロセス = $_.Properties[0].Value
理由 = $_.Properties[2].Value
ユーザー = $_.Properties[6].Value
}
} | Format-List
私の環境ではこう返ってきました。
日時 : 2026/05/14 3:07:01
プロセス : C:\WINDOWS\servicing\TrustedInstaller.exe
理由 : オペレーティング システム: アップグレード (計画済)
ユーザー : NT AUTHORITY\SYSTEM
ポイントは 「アップグレード (計画済)」 の文言と、 TrustedInstaller.exe が発火元という事実です。これは月例更新ではなく、 機能更新(Windowsのバージョン違い、25H2 → 26H2 のような大型アップグレード) が走った時の典型的なログです。
第1ラウンドで塞いだのは月例更新のパイプライン。機能更新は別ルートで動いていて、第1ラウンドの網をすり抜けて再起動を実施できる仕様でした。同じログ画面に、3:03 → 3:06 → 3:07 と、4分間に3回の再起動が並んでいたのも、機能更新インストールの典型的な挙動です。
機能更新を止める:TargetReleaseVersionでバージョン固定
Homeでも効く数少ない機能更新ブロック手段が TargetReleaseVersion(目標バージョン固定)です。「このバージョンに留まる」と宣言すると、それ以上のメジャーアップグレードが配信されなくなります。
まず現在のバージョンを確認します。
(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion") |
Select-Object ProductName, DisplayVersion, CurrentBuild
DisplayVersion の値(私の場合は 25H2)をメモしておきます。
次に、その値をターゲットとして固定します。
$wu = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"
New-Item -Path $wu -Force | Out-Null
New-ItemProperty -Path $wu -Name TargetReleaseVersion -PropertyType DWORD -Value 1 -Force
New-ItemProperty -Path $wu -Name TargetReleaseVersionInfo -PropertyType String -Value "25H2" -Force
New-ItemProperty -Path $wu -Name ProductVersion -PropertyType String -Value "Windows 11" -Force
gpupdate /force
TargetReleaseVersionInfo は 自分のPCの DisplayVersion と一致させる ことが重要です。間違えるとポリシーが無視されることがあります。
これに加えて、 設定 → Windows Update → 更新の一時停止 を最大の 5週間 に設定しておくと、月例更新も同じく延期されます。5週間後に切れるので、月1回手動で延長する運用になります。
健全性チェックと月次運用フロー
ここまで全部入れたら、設定が崩れていないかを一発で確認するスクリプトを置いておくと便利です。C:\check_no_reboot.ps1 などに保存しておきます。
Write-Host "=== 自動再起動防止設定の健全性チェック ===`n" -ForegroundColor Cyan
$au = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -ErrorAction SilentlyContinue
$wu = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -ErrorAction SilentlyContinue
$cc = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl"
$wm = Get-Service WaaSMedicSvc
"NoAutoRebootWithLoggedOnUsers : $($au.NoAutoRebootWithLoggedOnUsers) (期待値: 1)"
"AUOptions : $($au.AUOptions) (期待値: 2)"
"AlwaysAutoRebootAtScheduledTime: $($au.AlwaysAutoRebootAtScheduledTime) (期待値: 0)"
"TargetReleaseVersion : $($wu.TargetReleaseVersion) (期待値: 1)"
"TargetReleaseVersionInfo : $($wu.TargetReleaseVersionInfo) (期待値: 25H2)"
"WaaSMedicSvc : $($wm.Status) / $($wm.StartType) (期待値: Stopped / Disabled)"
"BSOD AutoReboot : $($cc.AutoReboot) (期待値: 0)"
期待値からズレた行があれば、その項目だけ再設定すればよい、というメンテ運用にできます。
設定だけ入れて終わり、にはなりません。セキュリティパッチを定期的に取り込まないと逆に危ない状態を作るので、月1回の 手動メンテナンス枠 を決めておきます。
設定 → Windows Update → 更新の再開更新プログラムのチェックボタンを押して取得- 更新があればインストール。「今すぐ再起動」は押さず、 自分の都合の良い時間 に手動で再起動
- 完了後、再び
5週間の一時停止をセット
このサイクルなら、Claude Code が深夜に動いている時間と再起動が衝突する確率はゼロにできます。
Claudeを相棒にしてここまで進めた話
ここからは、この記事を書こうと思った動機の話を少し。
Windows自動再起動を止める情報自体は世の中にたくさんあります。ただ、 今のWindowsの仕組みは複雑すぎて、ボタン一つで切り替えられるような話ではありません。レジストリの場所、タスクスケジューラの保護階層、機能更新と月例更新の違い、WaaSMedicSvcの存在 ―― 一つ一つ自分で調べていったら、答えにたどり着くまでに何時間もかかります。
今回私がやったのはこうです。
- 画面のハードコピーをClaudeに貼る
- 「これって何が起きてる?」「次は何をすればいい?」と聞く
- 返ってきたコマンドをPowerShellに貼る
- 結果のテキストをまた貼る
- 「アクセス拒否されました、どうする?」「機能更新だった、対策は?」と続ける
1サイクルが5〜10分です。自分で調べていたら、これが1サイクル数時間でした。失敗しても「何が原因だったか」を5分で確認できて、数日で完走できる ―― 私はこの感覚を、ここ最近の仕事のあらゆる場面で味わっています。
AIをしっかり使いながら、AI駆動型で自分の仕事を進めていく。 こんなにも効率が良くなるという、いい例 だと感じています。課題解決をしながら前に進めるので、強くおすすめできるやり方です。
まとめ
- Windows 11 Home でも、レジストリと一部のタスクXMLリネームで「手動以外で再起動しない」状態は作れる
- 月例更新と機能更新は別パイプライン。 両方を塞ぐには
TargetReleaseVersionの併用が必須 - 「設定したのにまた再起動された」が起きたら、まず
Event ID 1074で犯人を特定する。これだけで原因切り分けが10分で終わる - 完全自動更新を諦め、月1回の手動メンテ枠を持つ運用に切り替えると、Claude Code をはじめとする深夜タスクが安定して動くようになる
「ローカルWindowsでClaude CodeやAI自動化を本格的に動かしたいけど、運用設計が一人だと不安」と感じている方は、無料の30分オンライン診断で一緒に状況を整理できます。 Windowsの機嫌取りまで含めた運用設計 は、AI駆動の現場では意外と地味に効きます。
この記事の技術を、現場で実装したい方へ
AI×IoTの技術顧問として、月額契約で継続伴走しています。PoC設計・技術判断・組織設計・ベンダー管理・実装支援まで、現場で動くまで一緒に進めます。受託開発(請負)ではありません。
→ AI技術顧問サービスの詳細 / 無料30分オンライン診断 / 料金一覧






LEAVE A REPLY