Windows 2008 ServerでUPSと連動させた自動シャットダウン時のタスク実行

東日本大震災の被災者の方々に心からお見舞いを申し上げます。

まだまだ余震が続き、計画停電が続く中、UPSに接続したサーバシャットダウン時に別サーバ(UPSと非連動)へシャットダウンイベントを渡したくなった。
Windows 2008 Serverのタスクスケジューラをみても「シャットダウン時に実行」という項目が見当たらない。
調べてみるとWindows Vista以降のOSでは(Windows XPが手元にないのでVista前では未確認)シャットダウン時にタスクを自動実行できないようだ。

UPSの電源を抜き差ししながらイベントログを見ていると

警告:APC UPS Service
停電のためUPSはバッテリ運転に移行しました。
ログの名前:アプリケーション
ソース:APC UPS Service
イベントID:174
レベル:警告
ユーザ:SYSTEM

とでている。
また、電源を戻した際には

情報:APC UPS Service
UPSは商用電源に移行しました。
ログの名前:アプリケーション
ソース:APC UPS Service
イベントID:61455
レベル:情報
ユーザ:SYSTEM

なので、下記のようなスクリプトを作成
shutdown.vbs

Dim ws
Dim strProgram
Dim lockFile
Dim waitMilSec

lockFile = "lock.txt"
waitMilSec = 300000

'initialize
Set ws = Wscript.CreateObject("Wscript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
strProgram = """C:\WINDOWS\system32\SHUTDOWN.EXE"""

'Create the lock file
If objFSO.FileExists(lockFile) Then
	'objFSO.DeleteFile(lockFile)
Else
	objFSO.CreateTextFile(lockFile)
End If

'Now we wait before shutdown
WScript.Sleep waitMilSec 

'If the lock file still exists
If objFSO.FileExists(lockFile) Then
	'Do whatever needed before shutdow

	ws(strProgram & " -s -t 0")
Else
	'aborted
End If

abort.vbs

Dim lockFile

lockFile = "lock.txt"

'initialize
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

'Delete the lock file
If objFSO.FileExists(lockFile) Then
	objFSO.DeleteFile(lockFile)
End If

スクリプトとしては、UPS運転に切り替わるとshutdown.vbsが実行され「lock.txt」を作成する。5分後に再度「lock.txt」が存在するか確認して、存在する場合はシャットダウンを行う。
UPSから通常電源に戻ると「lock.txt」を削除する。これでshutdown.vbsが実行されていても「lock.txt」が存在しないのでシャットダウンはされない。

次にタスクの登録。
タスクスケジューラで「タスクの作成」を行う。
トリガを新規作成し「タスクの開始」プルダウンから「イベント時」を選択する。
設定で下記のように設定を行う

ログ:アプリケーション
ソース:APC UPS Service
イベントID:174

これで上記shutdown.vbsを登録すればOK。同じようにabort.vbsも登録するが、こちらは下記のような条件で登録する

ログ:アプリケーション
ソース:APC UPS Service
イベントID:61455

UPSのコンセントを抜いたときに「lock.txt」が作成されれば動く。