Wake On Lanで自宅サーバ節電 パートⅡ
OS : Windows XP Professional
やりたいこと
今度は、スリープからの復帰ではなく、シャットダウンからの立ち上げ&スリープからの自動復帰なし。である。なんのこっちゃ分かりにくいが、自分的には、前項のWake On Lanで自宅サーバ節電のやり方で十分と思っていたんだが、この方法だと、何かのイベントが発生する時か何かのタイミングでスリープからの復帰が割と頻繁に起こる…。これはあまりよろしくないなぁ…、と思ったので第2段である。
Wake On Lanの設定
前回と違うところは、電源の管理タブのところの、「管理ステーションでのみ、コンピュータのスタンバイ状態を解除できるようにする。」にチェックを入れる。これだけである。これで、Magic Packetを送信した時のみ反応するようになる。
Magic Packetを送信する
Magic Packetとは
マジックパケットとは、ブロードキャストアドレス「FF:FF:FF:FF:FF:FF」に続き、サーバーのMACアドレスを16回繰り返し送信するというものらしい。ふーん…。って感じやけど、では具体的にどうやって送信するか?である。
ネットで情報を集めてみると、フリーソフトを使ったり、はたまたMagicPacketを送信する事が出来るルーターもある。なんて記事を見つけた。我が家にはYAMAHAのルーターがある。ビンゴである。
YAMAHAルーターからMagic Packetを送信する
詳しくは、YAMAHAのマニュアルに載ってるが、『wol send lan1 macアドレス IPアドレス』ってコードをルーターに打ってやるとMagicPacketを送信してくれるみたい。
まずルーターに接続しなければ始まらないんだが、これにはtelnetってのを使って接続するらしい。コマンドプロンプトからtelnetに続いてルーターのIPを打つ。『telnet 192.168.***.***』ってな具合。これでtelnetクライアントが立ち上がって、ルーターに接続しようとするところまで来る。なにもコマンドプロンプトからいかんでも…、と思ったら、直接telnetクライアントを立ち上げてもいけるみたい。そのときは『open 192.168.***.***』とする。
YAMAHAルーターは最初から無名のユーザーがいて、まず最初に無名ユーザーのパスワードを聞いてくるので、入力して(パスを設定していなければ空で)「Enter」。
それから管理者「administrator」を打って、管理者パスワードを入力して「Enter」。
ここで、先ほどのwol sendのコード「wol send lan1 00:00:00:00:00:00 192.168.***.***」を入力して「Enter」。
これで見事に立ち上がる。わーい(^^)。
まぁしかし、都度こんな事をするのは当然面倒なので、batファイルを作る事を考えてみた。
batファイルでルーターにコードを送る
が、しかし、いきなり躓いた…。。。
つーのも、telnetのコマンドをbatファイルで書けないから…。。。
そりゃまぁそぉだ。。。で、いろいろネットサーフィンしてたら、vbsでtelnetのコマンドを書かせて、batファイルからそのvbsを呼び出すって方法を発見。↓サンプルコード抜粋。
-----------testtelnet.bat------------------
start "ABC"
cscript testtel.vbs
-------------------------------------------
-----------testtel.vbs---------------------
set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "ABC"
WScript.Sleep 3000
WshShell.SendKeys "telnet ホスト名~"
WScript.Sleep 3000
WshShell.SendKeys "ユーザー名~"
WScript.Sleep 3000
WshShell.SendKeys "パスワード~"
WScript.Sleep 3000
WshShell.SendKeys "コマンド~"
WScript.Sleep 3000
WshShell.SendKeys "exit~"
--------------------------------------------
batファイルで、"ABC"というcmdを立ち上げて、vbsを走らせている。vbsでは立ち上がった"ABC"をアクティブにして、windowsのScriptShellのSendKeysを使っている。なるほど…。で、とりあえず出来たんだが…。ふと思ったのは、vbsで全部かいたらあかんのかい?って話。何しろbatファイルで書いてるのって、コマンドプロンプト立ち上げて、vbs呼び出すだけなんやから…。
vbsでルーターにコードを送る
ビジュアルベーシックはExcelのマクロを組む時に割と触った、もっともあちらはVBAやけど、そない変わるもんでないし出来るやろ。しかも書くのはコマンドプロンプトを呼び出すとこだけ。と、思って取りかかってたら、そのコマンドプロンプトを呼び出すだけで手間取った…。下手にsendkeysのコードを書いてたもんやから、パソコンが暴走するする(T T)。ようはコマンドプロンプトを呼び出した後にそいつをアクティブにしてやる必要があるんやけど、ダブルクォーテーション「"」の中にダブルクォーテーションを書く手段が解らなかったんですなぁ。。。まぁダブルクォーテーションを二つつなげばOKってのが解ったけど、これだけでずいぶん時間がかかってしもた…。で、出来上がったのが↓。
Option Explicit
Dim wss
set wss = WScript.CreateObject("WScript.Shell")
wss.Run "cmd /c start ""wol_run""" 'コマンドプロンプト起動、wol_run名でコマンドプロンプト起動。
wss.AppActivate "wol_run" 'コマンドプロンプトwol_runをアクティブにする。
WScript.Sleep 500
wss.SendKeys "telnet ***.***.***.***~" 'telnetを起動して、ルーターにアクセス。
wss.SendKeys "{enter}~" '無名ユーザーログイン、パスなしの場合そのままEnter。
wss.SendKeys "administrator~" '管理者入力
wss.SendKeys "パスワード~" 'パスワード入力で、ログイン。
wss.SendKeys "wol send lan1 00:00:00:00:00:00 ***.***.***.***~"
WScript.Sleep 4000
wss.SendKeys "exit~" 'ルーターからログアウト。
wss.SendKeys "exit~" 'telnet終了、ホスト切断。
WScript.Sleep 500
wss.SendKeys "{enter}~" '待機に入るので、enterでコマンドプロンプトに戻る。
wss.SendKeys "exit~" 'コマンドプロンプト終了。
自分の環境ではこれで無事サーバが起動した。Sleep時間はタイミングにより変わってくると思われるので適当に調整。さらにこいつをクライアントのスタートアップスクリプトに設定してやれば、クライアントを立ち上げると同時にサーバも起きてくれる。グッジョブ!って感じに思ってたけど、あまりしっくりこない…。WinXPのスタートアップスクリプトでは問題なく動作するけど、Win7のスタートアップスクリプトでは動いてくれない。しかもXPは、このスクリプトが動き始める前にログイン画面が出てしまい、ログインしてしまうと、スクリプトが走ってくれない…。ログイン後のスタートアップに設定したほうがスマートって気がする。
ちなみに、telnet直接でももちろんOKで、次のように少し変更する。
Option Explicit
Dim wss
set wss = WScript.CreateObject("WScript.Shell")
wss.Run "telnet"
wss.AppActivate "C:\Windows\system32\telnet.exe"
WScript.Sleep 500
wss.SendKeys "open ***.***.***.***~"
wss.SendKeys "{enter}~"
wss.SendKeys "administrator~"
wss.SendKeys "パスワード~"
wss.SendKeys "wol send lan1 00:00:00:00:00:00 ***.***.***.***~"
WScript.Sleep 4000
wss.SendKeys "exit~"
wss.SendKeys "exit~"
WScript.Sleep 500
wss.SendKeys "{enter}~"
wss.SendKeys "quit~"