web-dev-qa-db-ja.com

Windowsシャットダウンコマンドが発行されたかどうかの検出

シャットダウンコマンドが発行されたかどうか(ユーザーのスタートメニュー、またはコンピューターで実行されているか、コンピューターにリモートアクセスできる他のプログラム)を検出してキャンセルできますか?
または、レジストリを微調整して、シャットダウンコマンドが発行されるたびにWindowsに強制的にシャットダウンタイマーを表示させ、無効にするコマンドを取得することはできますか?

7
user13267

はい、(ほとんど)いいえ。

シャットダウンイベントを検出できます。 Windowsがシャットダウンしようとすると、 WM_QueryEndSession 開いているすべてのアプリケーションに。これを検出するには、イベントを検出して処理するスクリプトまたはプログラムをバックグラウンドで実行する必要があります。ただし、シャットダウンがローカルマシンand userから開始されない限り、シャットダウンをキャンセルする方法はないようです。

その後、スクリプト/アプリはシャットダウンをキャッチし、スクリプト/アプリを終了するかどうかを尋ねます。この場合、キャンセルできます。これにより、マシンがシャットダウンするのを防ぎますが、他のアプリやおそらくサービスが終了するのを防ぎません。

このためのスクリプトは必要ありません。メモ帳を開いてテキストを入力するだけです。メモ帳にデータが保存されていないため、Windowsは待機してシャットダウンを続行するかどうかを尋ね、キャンセルする機会を与えます。繰り返しますが、これはyouがローカルでシャットダウンを開始した場合にのみ機能します。

WMIがありますWin32_ComputerShutdownEventイベント。コンピューターがremoteコマンドを介してシャットダウンしたときに発生します。ただし、このイベントはreceiveしか受信できません。イベントが受信されると、ローカルコンピューターは、イベントが配信されたときにスクリプトを終了します。

4
Keltari

私もこれを行う方法を見つけたいと思っています。postgreSQLが終了する前に適切にシャットダウンするのに十分な時間を確保するためですが、現時点ではあまり期待できません。

これは基本的には他の人の答えを言い換えただけですが、Windows 7の管理者プロンプトから次の2つのコマンドを試しました。

  1. shutdown /s & shutdown /a
  2. shutdown /s /t 0 & shutdown /a

最初のコマンドはシャットダウンを正常に中止しましたが、2番目のコマンドはそうしませんでした。これは、即時シャットダウンがshutdown /aで中止できないという Keltari のステートメントを証明します。

1
ksun

これはWindows 7(企業環境)の場合です。管理者がリモートシャットダウン(shutdown/m PCName)をトリガーした場合、Windows 7はPCがシャットダウン/再起動の指示を取得していることを示す通知を表示し、カウントダウンを提供します。

PCに座っているユーザーは、次のコマンドを実行してマシンの管理者権限も持っていると仮定して、キャンセルできます。

shutdown /a

進行中の既存のシャットダウンを中止します。

しかしもちろん、管理者が1秒間タイマーを設定した場合や、即時にシャットダウンした場合、この点は意味がありません。

Windows 8-システムトレイで(シャットダウンが発行されたときに)xxx分後にWindowsがシャットダウンしようとしていることが通知されます。シャットダウンはxxx時間/日付に行われます。また、Windows 8はシャットダウンまで1分で、60秒後にシャットダウンされることを示すフルスクリーン通知を表示し、実際には閉じるためにクリックしてメッセージを確認する必要があると信じています。

Windows XP-タイマーも表示されると思いますが、テストするWinXPマシンがないので確認できません。

繰り返しになりますが、上記のコマンドですべての「スケジュールされた」シャットダウンをキャンセルできますが、時間切れになった場合は、あまりできません。

1
Darius