電源管理の自動化[2]〜コンピュータを定時に自動起動
システム管理 完全自動化プロジェクト[実践編(8)]「実践編(7)」では、コンピュータのシャットダウンを自動化する方法を紹介した。ならば、逆に、指定した時間にコンピュータを自動的に起動したい、という要望もあるだろう。これは、PowerShellとWake On LAN機能を組み合わせることで簡単に実現することができる。
Project No.8 [要求事項]定時シャットダウンできるのなら、定時ブートもしたい
[使用テクニック]PowerShell、Wake On LAN
Wake On LAN機能を利用して自動起動にもチャレンジ!
コンピュータを定時にシャットダウンできるようにしたら(「実践編(7)〜コンピュータを定時にシャットダウン」を参照)、起動も自動化したいだろう。コンピュータを自動的に起動する方法はいくつかある。
サーバでよく利用されるのが無停電電源装置(UPS)のスケジュール稼働機能だ。システムのBIOSで自動起動を設定できる場合や、ネットワーク経由でコンピュータを起動する「Wake On LAN」機能もある。
ネットワークアダプタとシステムがWake On LANに対応している場合は「マジックパケット」と呼ばれる特別なパケットを送信することで、指定したMACアドレスを持つコンピュータに電源を投入することが可能だ。
マジックパケットを送信するユーティリティは、個人の自作ツールを含め、インターネットを探せば簡単に見つかるはずだ。ネットワークアダプタに付属するソフトウェアや、ブロードバンドルータなどのネットワーク機器の管理ツールでWake On LAN機能が提供されていることもある。
ここで特定のWake On LANツールを紹介するわけにもいかないので、今回はツールを自作してみた。以前は、この種のツールの作成には「Visual C++」などを使用したソケット(WinSock)プログラミングが必要だったが、今はもっと簡単に作成できる。PowerShellを利用すれば、たった6行のコードで実装できるのだ。
Wake On LANのマジックパケットは「FF FF FF FF FF FF」という同期用のシーケンスに続いて、起動対象のコンピュータのMACアドレスが16個続く、ブロードキャスト(同報送信)のパケット(MACフレーム)である(画面22)。通常はUDPデータグラムに載せて、ブロードキャストを送信し、リモートのコンピュータを起動する。
リスト11のPowerShellスクリプト「WakeOnLan.ps1」は、引数にMACアドレス(XX-XX-XX-XX-XX-XXの形式)を指定することで、同一LANセグメント内のコンピュータをWake On LANで起動する。なお、リスト11の行頭の数字は行番号を表し、実際のコードには含まれないので注意してほしい(リスト12も同様)。
1 param($MacAddress)
2 [byte[]] $MagicPacket = 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
3 $MagicPacket += (($MacAddress.split('-') | foreach {[byte]
('0x' + $_)}) * 16)
4 $UdpClient = New-Object System.Net.Sockets.UdpClient
5 $UdpClient.Connect(([System.Net.IPAddress]::Broadcast) ,9)
6 $UdpClient.Send($MagicPacket,$MagicPacket.length)
マジックパケットで使用するUDPポートは特に規定はないが、今回は「System Center Configuration Manager 2007」の「OS展開」に実装されたWake On LAN機能と同じ、UDPポート「9」を使用した。
コンピュータのMACアドレスは、コンピュータが起動した状態で「IPCONFIG /ALL」コマンドや「GETMAC」コマンドを実行すれば確認できる。Wake On LAN機能は、BIOSの設定やネットワークアダプタの設定が必要だが、ここでは省略する。
Wake On LANを有効にした停止中のコンピュータのMACアドレスを指定して、リスト11のPowerShellスクリプトを実行すれば、そのコンピュータにまったく触れることなく、リモートから起動することが可能だ(写真1)。
- 1
- 2





.gif)






























