• 親分お眠り

筆者は、一日中PCに向かって仕事しているため、PCの電源は落とさず、ずっとオンのままにしていた。しかし、昨今の電気料金の値上げを鑑みて、使っていないときにPCをスリープさせることにした。設定は簡単で「設定 ⇒ システム ⇒ 電源/電源とバッテリー ⇒ 画面とスリープ」で、スリープするまでの時間を設定するだけだ。ところが、実際に試してみると、いったんは、スリープ状態に入るものの、すぐに復帰してしまう。なにかが「眠り」を妨げているようだ。

Windowsでは、ACPIのS3やS0ixなどの、PCが「寝ている」状態を「スタンバイ」と呼ぶ(S4はハイバーネーションと呼ばれる)。このスタンバイに対して、いくつかのデバイスは稼働状態S0への復帰をさせることができる。これをWindowsでは「Wake」と呼ぶ。キーボードを押す、あるいは液晶を開いたときなどに復帰するのは、デバイスがS3からのWakeをサポートしており、スタンバイ中であっても、電源が供給されていて、Wakeイベントを発生できるからだ。WindowsにはWakeが可能だが、ユーザー設定で禁止できないデバイスもある。また、Wakeが可能だからといってWakeイベントを発生させるとは限らない。

スタンバイさせたPCが復帰するのは、何らかのデバイスがWakeさせていると考えられる。デバイスマネージャーで、ネットワークアダプターのプロパティにある「電源管理」タブを開いて見ると、「このデバイスで、コンピュータのスタンバイ状態を解除できるようにする」が有効になっていた。これをオフにすることで、勝手に復帰することはなくなった。しかし、これは、たまたま簡単だっただけだ。たとえば、キーボードからもWakeは可能だが、筆者のマシンのデバイスマネージャーにはキーボードデバイスが13個も登録されていた。そのプロパティをいちいち開いていくのはかなり面倒だ。

Windowsの電力管理に関しては、powercfg.exeがあり、GUIからできるようなことは、このコマンドでたいてい「カタ」がつく。Wakeを行えるデバイスの一覧は、


powercfg /devicequery wake_armed

で表示できる(要管理者権限)。デバイスによるWakeを禁止するには、“/devicedisablewake”を使う(写真01)。

  • 写真01: powercfgコマンドで、スタンバイを解除できるデバイスを表示(/devicequery wake_armed)、原因となるデバイスを“/devicedisablewake”でWake禁止にできる。PowerShellのCIM関連コマンドを使ってWake可能なデバイスを探し、Get-PnpDeviceコマンドの結果と組み合わせることで、HardwareIDが得られる。そこに含まれるベンダーコードから物理デバイスを探すのは難しくない。“VID_0853”は「東プレ」でREALFORCE キーボードのHardwareIDである

基本的な作業はこれで済むのだが、powercfgが表示するデバイス名は、実際にどのデバイスだかさっぱりわからない。“HID キーボード デバイス (017)”のように後ろに数字をつけて区別しているが、そもそも、この数字とデバイスの対応が不明である。このあたりがWindowsのイヤなところ。

Wakeが可能なデバイスの正確な情報を探してみよう。まず、デバイスを列挙するには、PowerShellの“Get-PnpDevice”コマンドがある。Keyboardクラスで、現在接続されているデバイスの一覧を得るには、


Get-PnpDevice -Class keyboard -Status ok

とする。この出力は、順番は異なるがコントロールパネルにあるデバイスマネージャーとほぼ一致する。

コマンドラインでスタンバイをWAKEできるデバイスの一覧を得るには、CIM(Common Information Model)コマンドを使う。


Get-CimInstance -Namespace root/WMI MSPower_DeviceWakeEnable | where Enable -eq  $true

ここで得られる“InstanceName”は、Get-PnPDevieの“HardwareID”の後ろに“_0”などが付加されたもの。ここを一致させることでCIMコマンドの出力に対してデバイス名を表示できる。


Get-CimInstance -Namespace root/WMI MSPower_DeviceWakeEnable | where Enable -eq $true | % { Get-PnpDevice | where DeviceID -eq $($_.InstanceName -replace '_0$') }

このコマンドの結果は、ネットワークデバイスを除いてPowercfgの結果に一致する。ネットワークアダプターの結果が一致しないのは、WindowsがWake On LANを自分で処理するために、ネットワークアダプターの電力管理を特別扱いしているためだ。PnPDeviceのInstanceIDからベンダーコード(“VID~”や“VEN~”)が得られる。これをインターネット検索すればメーカーが判明するので、実際の機器との対応は難しくない。

今回のタイトルのネタは、「親分お眠り 世界怪奇実話 4」(牧逸馬、現代教養文庫。1975年)である。当時、戦前の「異端」とされた作家が再評価され文庫化された。筆者などはその影響をもろに受けた。文庫化された1975年はサザエさんのアニメが始まり、ベトナム戦争が終結、MITS社のAltair 8800が発売されビルゲイツがBASICを開発した年である。