タスクでシャットダウン

所属 :和泉AV・ITサポートサービス
作成者 :加賀 賢太朗
作成日 :2006年03月04日
最終修正 :2006年03月04日

業務終了の時間に受付用のパソコンをタスクでシャットダウンする方法を模索しました。
タスクで実行しつつ、利用しているときには「中断」を選択できるようにしたかったのでいろんな方法を模索してみました。

その1:ショートカットでシャットダウン

デジタルARENAの実践テクニックを参考にしてみる。

Windows XPを高速にシャットダウンするから引用

デスクトップの何もないところを右クリックして「新規作成」−「ショートカット」を選ぶ。「ショートカットの作成」ウィザードが起動するので、「項目の場所を入力してください」に「shutdown -s -f -t 0」と入力して「次へ」ボタンをクリックする。「このショートカントの名前を入力してください」に適当な名前(例えば、「高速シャットダウン」)を入力して「完了」ボタンをクリックする。
 デスクトップにショートカットができるので、これをダブルクリックすれば、確認のメッセージなしてWindowsがシャットダウンする。タスクバー上のクイック起動バーにこのショートカットを登録しておけば、シングルクリックで高速シャットダウンできる。

 ちなみに、「shutdown」コマンドに付けたオプションに意味は次のとおりだ。
-s:コンピュータをシャットダウンする
-t 0:シャットダウンのタイムアウトを 0 秒に設定する
-f:実行中のアプリケーションを警告なしに閉じる

 このほかに、次のようなコマンドのショートカットを作ると、ログオフや再起動がワンタッチで行える。
・ログオフ
shutdown -l -f
・再起動
shutdown -r -f -t 0

ショートカットを作ってタスクに放り込んでやれば出来そうな気がする。

ショートカットアイコンを作ってみた。

シャットダウンのショートカット

リンク先「%windir%\system32\shutdown.exe -s -f -t 60 -c "シャットダウンを中止するには、<<STOP shutdown>>をクリック"」
シャットダウンします。

シャットダウンのショートカット

「アイコンの変更」でそれっぽいアイコンを選択した。

シャットダウン中止のショートカット

リンク先「%windir%\system32\shutdown.exe -a」
シャットダウン処理を中止します。

シャットダウン中止のショートカット

こちらも「アイコンの変更」でSTOPな感じのアイコンを選択した。

タスクを作ってみた

シャットダウンするためのタスクの画面
実行するにはパスワード設定をしてある管理者権限のアカウントで登録しました。

スケジュールには定時ちょっと前を指定してみた。

ショートカットアイコンでの結果

「実行するファイル名」で画像はshutdownコマンドを直で指定しておりますがダメでした。もちろんショートカットもダメでした。

どちらも「スクリーンセーバーが働いているとダメ。」みたいです。
アイコンをクリックすることでシャットダウンと停止が選べるのでひとまずはこのままにします。

その2:VBスクリプトでシャットダウンさせる

WinFAQを参考にしてみる。

Windows 2000/XP でログオフ/シャットダウン/再起動アイコンを作るには?から引用

Windows 2000 リソースキットに付属の restart.vbs のオプション付きショートカットを作成することで、ログオフ/シャットダウン/再起動などのアイコンを作成することができます。
より簡易にアイコンを作りたい場合は、以下のスクリプトをダウンロードしてください。
restart.vbs と同様、WinMgmt を利用してログオフなどを行う単機能スクリプトです。(ダブルクリックするだけで使えます。)

上記のページから「poweroff.vbs」をダウンロードして中身を見るとこんな感じになっている。

Set objSystemSet =
 GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}").InstancesOf("Win32_OperatingSystem")
For Each objSystem In objSystemSet
    objSystem.Win32Shutdown 8
Next

VBスクリプトでの結果

上記のvbsを保存してタスクから呼び出す。
このままだと、指定した時間になると強制的にシャットダウン処理が開始されてしまう。それでは困る。

その3:WSHでシャットダウンさせる

「その2」の方法では「時間になったら強制終了」が行われる。
それはショッパイのでキャンセルが出来るような仕組みが必要に思えてきた。

Microsoft TechNetを参考にしてみる。

ローカル コンピュータのシャットダウンから引用

説明
ローカル コンピュータをシャットダウンします。
スクリプトコード

Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select
* from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
    ObjOperatingSystem.Win32Shutdown(1)
Next

陽気な題名のページにも参考になるところがあった。

Hey, Scripting Guy!
指定した時間が経過するとメッセージ ボックスが自動的に閉じるようにする方法はありますか。
から引用

ここで、[はい] ボタンと [いいえ] ボタンを持つメッセージ ボックスを表示し、ユーザーがいずれかのボタンをクリックしたか、10 秒の制限時間が経過したために自動的に閉じたかを報告する簡単なスクリプトを見てみましょう。

Const wshYes = 6
Const wshNo = 7
Const wshYesNoDialog = 4
Const wshQuestionMark = 32

Set objShell = CreateObject("Wscript.Shell")

intReturn = objShell.Popup("Do you want to delete this file?",
_
    10, "Delete File", wshYesNoDialog + wshQuestionMark)

If intReturn = wshYes Then
    Wscript.Echo "You clicked the Yes button."
ElseIf intReturn = wshNo Then
    Wscript.Echo "You clicked the No button."
Else
    Wscript.Echo "The popup timed out."
End If

この二つを組み合わせて日本語で表示させるのが次のvbsファイルになる。

完成形だとおもう。

'参考
'http://www.microsoft.com/japan/technet/scriptcenter/scripts/desktop/state/dmstvb08.mspx
'http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/mar05/hey0314.mspx
Const wshYes = 6 Const wshNo = 7 Const wshYesNoDialog = 4 Const wshQuestionMark = 32 Set objShell = CreateObject("Wscript.Shell") intReturn = objShell.Popup("シャットダウン処理を実行します。キャンセルしますか?", _ 60, "シャットダウン処理開始", wshYesNoDialog + wshQuestionMark) If intReturn = wshYes Then Wscript.Echo "シャットダウン処理をキャンセルしました" ElseIf intReturn = wshNo Then Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems ObjOperatingSystem.Win32Shutdown(1) Next Wscript.Echo "シャットダウン処理を実行しています。" Else Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems ObjOperatingSystem.Win32Shutdown(1) Next Wscript.Echo "タイムアウトです。シャットダウン処理を実行しています。" End If

このファイルを「shutdown.vbs」とか名付けて、「C:\tools(適当なとこ)」に保存してタスクのスケジュールで呼び出してあげればよいとおもう。

シャットダウンの部分を関数にするのが普通なんだろうけど、なんだか動かないのでこのような形になった。