「ハードウェアWoL」は、ネットワークコントローラーが内蔵するマジックパケット検出機能を使い、電源イベントをシステム側に発生させることで、スリープからの復帰を行う。ハードウェアWoLは、ハードウェア機能として実装されるため、メーカーでの設計段階で、採用の可否が決まる。
そのため、単純にネットワークコントローラーの型番などから、その存在を判定できない。それでも、簡易には、UEFIの設定メニューにWoLの有効/無効を切り替える項目があれば、ハードウェアWoLを搭載していると断定できる。ファームウェアパスワードとの両立をどうさせるかといったセキュリティ的な問題もあるため、UEFIの設定メニューに項目が存在しないのに、機能が実装されている可能性は低いだろう。
また、別の問題としてメーカーや機種ごとにUEFIの設定メニューにおけるWoLの表現が違っていることが挙げられる。原因は不明だが、ざっと見た感じでも下表のように表現にばらつきがある。
メーカー | 呼称 |
---|---|
DELL | Wake on LAN |
富士通 | LANによるウェイクアップ |
HP | Wake on LAN |
Lenovo | Wake on LAN |
NEC | Remote Power On |
Panasonic | Power On by LAN機能 |
東芝 | Wake-up On LAN |
主なメーカーのWoL表記 |
ハードウェアWoLを有効にするには、UEFIのセットアップメニューを起動する必要がある。Windows 10の起動中なら、[Windowsの設定]アプリの[更新とセキュリティ]−[回復]にある「PCの起動をカスタマイズする」で[今すぐ再起動]ボタンを押す。
再起動後、[オプションの選択]画面が表示されるので、[トラブルシューティング]−[詳細オプション]−[UEFIファームウェアの設定]とメニューをたどり、[再起動]ボタンを押す。あるいは[スタート]メニューから再起動を行い、起動時に[F2]キーの連打で呼び出すこともできる(詳細はTech TIPS「Windows 10でBIOS/UEFIセットアップ画面を確実に開く方法」参照)。
UEFIが主流になってセットアップの起動は[F2]キーに集約されつつある一方、BIOS世代との互換性のため、他のキーを使うメーカーや機種もある。Lenovoには、[F1]キーを使う機種があり、Hewlett-Packard(HP)には[Esc]キーを使う機種がある。キーによるUEFIの設定画面の起動は、製品のマニュアルなどで確認が必要だ。
UEFIの設定画面が表示されたら、WoLと思われる機能を探す。そのありかは周辺デバイスの設定かもしれないし、電力関係の設定かもしれない。このあたりはメーカーの違いが出るところだ。見つけたらWoL機能を有効にする。これでハードウェアWoLを使う準備ができた。
次にWindows 10を起動し、ソフトウェアWoLと同じく、デバイスドライバのプロパティにある[詳細設定]タブでWoLを有効化する設定を行う。また、同じくデバイスドライバのプロパティにある[電源の管理]タブの「このデバイスで、コンピューターのスタンバイ状態を解除できるようにする」にチェックを入れる。この部分の設定は、ソフトウェアWoLと同じである。
もう1つ注意するのは、Windows 10の標準のシャットダウンは前述のように「S4」ステートを使う点だ。ハードウェアWoLは、「S5(完全なる電源オフ)」ステートからの復帰のみをサポートしているため、シャットダウンを「S5」ステートで行う「クラシックシャットダウン」を選ぶ必要がある。
これには、「高速スタートアップ」を禁止し、常にクラシックシャットダウンとする設定と、[Shift]キーを押しながら[スタート]メニューの[電源]ボタンの[シャットダウン]をクリックして、強制的にクラシックシャットダウンを行わせる方法などがある(詳細はTech TIPS「Windows 10を完全にシャットダウンする」参照)。
前者は、常にクラシックシャットダウンとなるのに対して、起動が高速になるという「高速スタートアップ」が無効になるというデメリットがある。これに対し、後者は、高速スタートアップ設定は無効にならないものの、毎回シャットダウン時にWoLでの起動の有無を考えて[Shift]キーを押すかどうかを判断しなければならず、シャットダウン操作がかなり面倒だ。
WoLでは、ネットワーク側から「マジックパケット」を送信することで、対象とするPCを「起動」(あるいは「復帰」)させることができる。このマジックパケットは以下のような仕様になっている。
このように比較的簡単な仕様なのに、Windows OSには標準でマジックパケットを送信する機能がない。このためフリーソフトウェアなどを使うことが多い。
しかし、社内でフリーソフトウェアの利用には制限がある場合や、できれば素性がはっきりしており、問題がないソフトウェアを使いたい場合もあるだろう。インターネット検索をすると幾つかのツールが見つかるものの、バイナリプログラムは、ウイルス感染の可能性などもあり、素直に推奨ができない。
そこで今回は、PowerShellによるマジックパケット送信プログラムを作成した。これは単に指定されたブロードキャストアドレスに対して、指定されたMACアドレスを使ったマジックパケットを送信するものだ。たいしたプログラムではないし、短いものなので自由に使ってもらって構わない。ただし、エラー処理などはほとんどしていないため、間違ったパラメーターでもエラーに気が付かないことがある点には注意されたい。呼び出し方は、以下の通りである。
WakeOnLAN "<対象のMacアドレス>" "<ブロードキャストアドレス>"
「<対象のMACアドレス>」は、16進数をハイフンで区切った形式で、「"1A-2B-3C-4D-5E-0F"」のように指定する(ipconfigコマンドや「Windowsの設定」アプリの[ネットワークとインターネット]などで使われている形式)。「<ブロードキャストアドレス>」は利用しているLANのブロードキャストアドレスを「"192.168.0.255"」のように指定する。ブロードキャストアドレスに関しては、Tech TIPS「ブロードキャストアドレスの種類を知る」を参照いただきたい。
ただし、WoLでは、前記の記事で言う「ディレクテッドブロードキャストアドレス」のみが利用でき、「255.255.255.255」を宛先としたブロードキャストでは動作しない。また、ブロードキャストという仕様からIPv4でのみ動作する。このため、前記のプログラムも全てIPアドレスの指定はIPv4で行う。
下に示したスクリプトのテキストをメモ帳などのテキストエディタに貼り付け、「WakeOnLAN.ps1」という名前で保存する(文字コードはUTF-8にすること)。
#
# (C) 2020 Shinji Shioda
#
# WakeOnLAN
# Magic Packet送信
# Usage: WakeOnLAN "Terget MAC Address" "Broadcast Address"
# "Terget MAC Address" 起動するマシンのMACアドレス(文字列)
# "Broadcast Address" マジックパケットを送るブロードキャストアドレス(文字列)
# Ex: WakeOnLAN "1F-2E-3D-4C-5B-6A" "192.168.0.255"
function global:WakeOnLAN ([string]$MacAddress,[string]$BroadCastAddress) {
$MacPart=($MacAddress.Split("-") | ForEach-Object { [System.Convert]::ToByte($_,16) })
$EndPoint=New-Object System.Net.IPEndPoint ([system.net.IPAddress]::Parse(($BroadCastAddress)),10000)
$Socket=New-Object System.Net.Sockets.Socket `
([System.Net.Sockets.AddressFamily]::InterNetwork),`
([System.Net.Sockets.SocketType]::Dgram),`
([System.Net.Sockets.ProtocolType]::UDP)
$Socket.SetSocketOption(`
[System.Net.Sockets.SocketOptionLevel]::Socket,`
[System.Net.Sockets.SocketOptionName]::Broadcast,$true)
[void] $Socket.SendTo(([byte[]] (@(0xFF) *6))+($MacPart*16),$EndPoint)
$Socket.Close()
}
PowerShellを管理者権限で起動し、「WakeOnLan.ps1」を保存したフォルダに移動(Set-Locationコマンドレットまたはcdコマンドを使う)して、「./wakeonlan.ps1」を実行して、スクリプトを読み込ませる。後は、上記のように「WakeOnLAN」を実行すればよい。
./WakeOnLan.ps1
WakeOnLAN "<対象のMacアドレス>" "<ブロードキャストアドレス>"
なお、マジックパケットの仕様から、送信元と起動するマシンは同一のIPサブネットに接続している必要がある。遠隔地のPCを起動させるのであれば、起動させたいPCが接続しているLANにVPNなどで接続しておく必要がある。
また、MACアドレスは事前に調べておく必要がある。電源がオフになっているマシンのMACアドレスを調べることができないからだ。WoLを使って起動するのであれば、対象となるPCのIPアドレスやMACアドレスのリストを作っておくべきだろう。IPアドレスは、DHCPでの予約が望ましい。WoLではIPアドレスは直接には不要だ。しかし、トラブル時にはpingコマンドなどのツールを使うために必要になる。
対象となるPCのMACアドレスとIPアドレスは、対象となるPC上で[Windowsの設定]アプリで[ネットワークとインターネット]画面を開き、左ペインで[状態]を選択、右ペインの[ネットワークのプロパティを表示]リンクをクリックすると表示される。複数のネットワークアダプターが搭載されている場合は、マジックパケットを受信するアダプターを「名前」で判断する。
ここでは、手元にあった機材を使ってWoLをテストしてみた。対象のPCは、4機種で、うち2機種は、Modern Standby対応機種である。結論からいうと、Modern Standby非対応のメーカー製品は全てハードウェアWoLに対応していて動作した。また内蔵LANではWoLによりスリープ、休止状態からの復帰が行えた。
これに対して外付けUSBネットワークアダプターは、WoLで「S3」ステートからの復帰には対応した一方で、「S4」ステートからは復帰できなかった。無線LANからのWoLは1機種のみが対応していた。
機種 | Modern Standby | Windows 10 | LAN | ハードウェアWoL*1 | 内蔵LANからのWoL | 外付けUSB-LANからのWoL*2 |
---|---|---|---|---|---|---|
Panasonic CF-RZ6 | × | November 2019 Update (Build18363.720) |
Intel Ethernet Connection I219-LM | ○ | S3/S4 | S3/− |
Lenovo ThinkPad X1 Yoga(2018) | × | May 2019 Update (Build 18362.657) |
Intel Ethernet Connection I219-LM | ○ | S3/S4 | S3/− |
HP Elite X2 1013 G3 | ○ | November 2019 Update9 (Build18363.720) |
Realtek USB GbE Family Controller(TB) | ×*3 | ×*4/S4 | −/− |
機種 | Modern Standby | Windows 10 | 無線LAN | 内蔵WLANからのWoL*5 |
---|---|---|---|---|
Panasonic CF-RZ6 | × | November 2019 Update (Build18363.720) |
Intel Dual Band Wireless-AC-8265 | S3 |
Lenovo ThinkPad X1 Yoga(2018) | × | May 2019 Update (Build 18362.657) |
Intel Dual Band Wireless-AC-8265 | × |
HP Elite X2 1013 G3 | ○ | November 2019 Update9 (Build18363.720) |
Intel Dual Band Wireless-AC-8265 | × |
なお、WoLが正しく動作したかどうかは、復帰後に、「powercfg /lastwake」コマンドを使って、最後の復帰の原因となったデバイスを表示させて行った。Modern Standbyでは、ハードウェアWoLに対応していた機種はなかった。一方、内蔵LAN(正確には純正ThunderBold3接続ドッキングステーション内蔵のLAN)からのソフトウェアWoL(ただし「S4」ステートからの復帰)には、1機種が対応していた。しかし、無線LANや外付けUSBネットワークアダプターからのWoLは行うことができなかった。
前記の表から分かるように、内蔵ネットワークデバイスの型番のみでは、WoL対応の可否は判断できず、powercfgコマンドを使う必要があった([電力の管理]タブで設定項目がグレーアウトしていることでも確認は可)。また、Modern Standby構成でWindows 10がプリインストールされている場合、内蔵LANがあれば、「S4」ステートからのWoLができることが確認できた。ただし、こちらもハードウェア設計に依存する部分なので、事前に確認が必要だろう。
外付けUSBネットワークアダプターは手元の3つを評価してみた。ファストリング(Fast Ring)のプレビュー版(東芝 dynabook RZ83/VB)では動作しなかったものの、May 2019 Update(バージョン1903)、November 2019 Update(バージョン2019)ともに3つのUSBネットワークアダプターで動作した。
アダプター名称 | 内蔵チップ | Panasonic CF-RZ6 | Lenovo ThinkPad X1 Yoga(2018) | 東芝 dynabook RZ83/VB |
---|---|---|---|---|
ロジテック LAN-GTJU3H3 | ASIX AX88179 | ○ | ○ | × |
ロジテック LAN-GTJU3 | ASIX AX88179 | ○ | ○ | × |
メーカー不明 USB3.0 Gigabit Ethernet adapter | Realtek USB GbE Family Controller | ○ | ○ | × |
うち1つはメーカーが不明で、メーカーのWebサイトも不明である。また、メーカー品(ロジテック)は、どれも製品ページには、WoLに対応しているとの記載がなかった。
表には掲載していないが、PanasonicとLenovoは前の表と同じで、東芝がファストリングのプレビュー版(Build19603)である。このプレビュー版(非Modern Standby)では、WoLが正しく動作せず、復帰が行えなかった。
Windows 10側の問題やデバイスドライバのバージョン(今回の評価ではBoxドライバを利用)によって、WoLが動作しない可能性が考えられる。特にWindows 10では半年ごとにバージョンが変わり、アップデートによっては、不具合が発生することも珍しくない。Windows 10をアップデートしたらWoLが動作しなくなる可能性は否定できない。WoLが重要な機能である場合、アップデートの取り消しが可能な期間にWoLが可能かどうかのテストを行っておくべきだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.