状況
WindowsUpdateをしたあとSleepが数秒でSleep解除されたり、夜中にSleep解除される。
どうせTaskScadulerの何かが初期値に戻ったせいで発生したのだろう。
毎回忘れてしまうのでSleep解除をしないようにする手順を書いておく。
Windows の設定やレジストリを編集する場合は、自己の責任においておこなってください。
参考にしたサイト
syghの新フラグメント置き場 - Windows Updateとの戦い(2018年春の陣、休止状態解除の亡霊)
一斗缶観測日記- - SYSTEM権限でタスクスケジューラを実行する方法
1.準備
1.1. PsTools
プロセスをあれこれするツール
ダウンロードして任意の場所に展開しておく。
https://learn.microsoft.com/ja-jp/sysinternals/downloads/pstools
2.Sleep解除しているTaskを特定する
2.1. Task定義情報
TaskScadulerの定義内容は以下に拡張子なしのxmlファイルとして格納されている。
%windir%\system32\Tasks
2.2. 実体はファイルだが実際はレジストリ上にバイナリキャッシュとして持っているようだ
以降の手順でSleep解除できない場合は、このキャッシュの値で上書きして戻されたのかもしれない。
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache
2.3. Tasks_Migratedについて
%windir%\\System32\Tasks_Migrated
はなんなのか不明
マイグレーション(WindowsUpdate)した時のBackupだろうか?
2.4. 任意の場所へTask定義情報をコピーする
そのままではファイル開いたりできないので別の場所にコピーして調べるために
windowsフォルダをコピー
%windir%\system32\Tasks\windows
↓
任意の場所
2.5. Sleep解除しているTaskを特定する
Task定義情報をコピーした任意の場所のファイルに対してgrepをかける。
grep文字列:<WakeToRun>true</WakeToRun>
私の環境では以下が検出されました。
.NET Framework.NET Framework NGEN v4.0.30319 64 Critical(20): true
.NET Framework.NET Framework NGEN v4.0.30319 Critical(20): true
InstallService\WakeUpAndContinueUpdates(19): true
InstallService\WakeUpAndScanForUpdates(19): true
SharedPC\Account Cleanup(20): true
UpdateOrchestrator\Schedule Wake To Work(36): true
以前Sleep解除OFFにしたSchedule Wake To WorkがWindowsUpdateでONになったようです。
UpdateOrchestrator\Schedule Wake To Work(36): true
TaskScadulerで確認するとSleep解除して実行にチェックがついています。
確認したらTaskScadulerは終了させておきます。
3.TaskScadulerをSYSTEM権限で起動してSleep解除のチェックを外す
Schedule Wake To Workの所有はSYSTEMであるため普通にTaskScadulerを使っても変更できない。
3.1. コマンドプロンプトを管理者で起動する
3.2 起動したコマンドプロンプトからSYSTEMユーザでコマンドプロンプトを起動する
PsExec.exe -s -i cmd
3.3. SYSTEMユーザでTaskScadulerを起動する
3.4. TaskScadulerが起動します。
タスクマネージャーで確認するとSYSTEMユーザで実行されています。
3.5. Sleep解除したいタスクを開きSleep解除のチェックを外す
記載していませんが、以下のタスクについてもSleep解除のチェックを外しました。
InstallService\WakeUpAndContinueUpdates(19): true
InstallService\WakeUpAndScanForUpdates(19): true