使用 Powershell 检测系统关机

5

你好,我有一个监控脚本(带有WinForms GUI),一直在后台运行。

不幸的是,当用户尝试手动关闭计算机时,这会引发“此应用程序正在阻止Windows关机”屏幕,令用户感到困扰。

因此,我需要一种可靠的方法,在启动关机时自动关闭脚本。

我尝试订阅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读取它们时,事件中没有错误。所有事件的状态都是“未启动”。

有什么想法吗?


可能是Powershell窗口阻止关机的重复问题。 - Ken White
这是我自己在上面发布的相同解决方案。它没有起作用,至少不是每次都有效。不幸的是,我无法说出为什么它没有起作用,因此我正在寻找替代解决方案,如果有的话。 - Rob
不,不是这样的。链接的帖子包含比你在这里发布的代码要多得多,并且还包括注册第二个事件。你应该仔细阅读它。(它也已被接受,这通常意味着提问者发现解决方案有效。) - Ken White
是的,它有更多的代码,但只有在事件成功被触发后才会执行的代码。因此,这对任务并不重要。我也尝试了第二个事件,但没有起到帮助作用。我将在原始帖子中添加这一点。 - Rob
3个回答

4
以下代码并不是对您完整问题的回答,但可以解决您标题中的问题,并且有助于那些只想停止已经超时的关机程序的人:
```bash sudo shutdown -c ```
该命令将取消当前正在进行的关机程序。
If ( [ System.Environment ]:: HasShutdownStarted ) {
  & "$env:SystemRoot\System32\Shutdown.exe" -a ;
}

我尽可能使用空格,并使用分号使内容更加清晰易懂。


2

好的,解决方案是:如果系统关闭,Windows会向所有应用程序发送WM_QUIT消息。 如果您订阅了onClosing事件,可以查询$eventargs是否已触发该事件。 它包含一个CloseReason属性,如果它是WindowsShutdown,则可以用于启动适当的清理和关闭应用程序。 有关如何执行此操作的更多信息,请参见此帖子的答案。


0

谢谢,我会尝试的。 - Rob
截至2020年8月,链接已更改为https://devblogs.microsoft.com/scripting/hey-scripting-guy-can-i-use-wmi-to-determine-when-someone-logs-off-a-user-or-shuts-down-a-server/。 - rs232

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接