使用Powershell检测系统关闭

时间:2016-01-21 23:50:47

标签: powershell events shutdown

我有一个监视脚本(带有winforms gui),它总是在后面运行。 不幸的是,当用户试图手动关闭计算机时,这会让用户感到恼火,因为它会引发" 此应用阻止Windows关闭" -screen。

所以我需要一种可靠的方式来在启动关闭时自动关闭脚本。

我尝试订阅SessionEnding - 和SessionEnded事件,但它不起作用:

$sysevent = [microsoft.win32.systemevents]
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { Exitfunction }

更新: 就像这样:

$sysevent = [microsoft.win32.systemevents]
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnded" -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
Register-WmiEvent -Class win32_computerShutdownEvent -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}

我添加了一个消息框,看看其中一个事件是否实际上会触发,但是动作脚本块执行的代码可能有问题。没运气。 当我尝试关闭Windows 8.1系统时,这些事件都没有发生。 当我用get-job读取它们时,事件中有无错误。国家在所有人中并没有开始"。

任何想法为什么?

3 个答案:

答案 0 :(得分:2)

确定解决方案是:如果启动了关闭,Windows会向所有应用程序发送WM_QUIT消息。如果您订阅onClosing - 事件,则可以查询$eventargs是否已触发该事件。它包含CloseReason - 属性,如果它是WindowsShutdown,则可用于启动正确的清理并关闭应用程序。 有关如何执行此操作的详细信息,请参阅此post的答案。

答案 1 :(得分:2)

以下代码不是您完整问题的答案,但它取决于您的标题问题,并且可能会帮助那些只想停止关机的人:

If ( [ System.Environment ]:: HasShutdownStarted ) {
  & "$env:SystemRoot\System32\Shutdown.exe" -a ;
}

我尽可能使用空格和分号给我带来更多的清晰度。

答案 2 :(得分:0)

你看过这篇文章吗?

http://blogs.technet.com/b/heyscriptingguy/archive/2010/04/15/hey-scripting-guy-april-15-2010.aspx

他用wmi来观看比赛 Register-WmiEvent -Class win32_computerShutdownEvent