高感度なゲーミングマウス(Razerなど)や、ネットワーク共有、Windows Updateなどが原因で、PCをスリープさせても「数秒で勝手に復帰する(あるいはスリープしない)」現象に悩まされたので、 PowerShellを使って徹底的に原因を潰した 際のログとコマンドまとめです。
GUIをポチポチ探すのが面倒な方向けのCLI処方箋です。
まずは「何が原因で直近PCが起きたのか」と「現在、誰がPCを起こす権利を持っているか」を確認します。
PowerShellを 管理者権限 で開き、以下のコマンドを実行します。
# 直近の起動要因を確認
powercfg -lastwake
# 現在、スリープ解除権限を持っているデバイス一覧を表示
powercfg -devicequery wake_armed
よくある犯人:
HID-compliant mouse / Razer DeathAdder... (マウスの振動検知)Intel(R) Ethernet Controller... (Wake-on-LANやパケット受信)UpdateOrchestrator (Windows Updateのメンテナンスタスク)高DPIのマウスは、机のわずかな振動や空調の風でも「操作」と判定され、スリープを解除してしまいます。 デバイスマネージャーから探すのは手間なので、デバイス名を指定して権限を剥奪します。
# 特定のデバイスを指定して無効化(名前は devicequery で確認したもの)
powercfg -devicedisablewake "Razer DeathAdder V4 Pro"
powercfg -devicedisablewake "HID-compliant mouse"
Razer製品などは仮想デバイスとして複数の「HID準拠マウス」を作ることがあるため、一括で無効化するのが確実です。 ※キーボードは残しておかないと、電源ボタン以外で復帰できなくなるので注意。
# すべてのポインティングデバイス(マウス類)のスリープ解除権限を剥奪
Get-CimInstance Win32_PointingDevice | ForEach-Object {
$name="$_.Name"
Write-Host "Disabling wake for: "$name'
powercfg -devicedisablewake '$name"}
メディアサーバー機能やファイル共有を使っていると、他のデバイスからのアクセスチェックでPCが叩き起こされます。
# イーサネット等のNWアダプタによる解除を禁止
Get-NetAdapter | ForEach-Object {
# Wake on Magic Packet / Pattern Match を無効化
Set-NetAdapterPowerManagement -Name $_.Name -WakeOnMagicPacket Disabled -WakeOnPattern Disabled
}
Windowsはデフォルトで「メディア共有中はスリープしない(Away Mode)」設定になっています。これを強制的に「スリープ許可」に変更します。
# 「メディアを共有するとき」の設定を「コンピューターのスリープを許可する」に変更
powercfg -setacvalueindex SCHEME_CURRENT 9596fb26-9850-41fd-ac3e-f7c3c00afd4b 03680956-93bc-4294-bba6-4e0f09bb717f 0
powercfg -setactive SCHEME_CURRENT
UpdateOrchestrator などのタスクは、タスクスケジューラから無効化しようとしても 「アクセスが拒否されました」 となり、管理者権限でも止められないことがあります。
そのため、タスク自体ではなく「スリープ解除タイマー(Wake Timers)」の使用権限をシステム全体で無効化します。これが最強の解決策です。
# 電源接続時のスリープ解除タイマーを無効化
powercfg -setacvalueindex SCHEME_CURRENT 238c9fa8-0aad-41ed-83f4-97be242c8f20 bd3b7180-0530-45fb-8885-af2718140a23 0
# バッテリー駆動時のスリープ解除タイマーを無効化
powercfg -setdcvalueindex SCHEME_CURRENT 238c9fa8-0aad-41ed-83f4-97be242c8f20 bd3b7180-0530-45fb-8885-af2718140a23 0
# 設定反映
powercfg -setactive SCHEME_CURRENT
Win + z などで即座にモニターを消したい場合、キーを離す瞬間の信号で即復帰してしまう問題があります。BlockInput で入力を遮断してから実行するのがコツです。
; Win + z でモニターオフ
#z::
; マウス等の入力で即復帰するのを防ぐため入力を一時ブロック
BlockInput, On
; キーが完全に離されるのを待つ
KeyWait, z
KeyWait, LWin
KeyWait, RWin
; 念のためバッファ(マウスセンサーの安定待ち)
Sleep, 1000
; モニター電源オフ (0xF170 = SC_MONITORPOWER, 2 = Off)
SendMessage, 0x112, 0xF170, 2,, Program Manager
; 入力ブロック解除
BlockInput, Off
Return
Wake Timers の設定で封じ込める。これで、夜中に勝手にPCが光り出す怪奇現象から開放されました。