【问题标题】:Detect System Shutdown with Powershell使用 Powershell 检测系统关闭
【发布时间】:2017-01-11 11:07:46
【问题描述】:

您好,我有一个始终在后面运行的监控脚本(带有 winforms gui)。 不幸的是,当用户尝试手动关闭计算机时,这会惹恼用户,因为它会引发“此应用正在阻止 Windows 关机”屏幕。

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

我尝试订阅SessionEnding- 和 SessionEnded-event,但没有成功:

$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 读取事件时,事件内部没有没有错误。所有的状态都是“未开始”。

有什么想法吗?

【问题讨论】:

  • 这与我在上面发布的解决方案相同。它不起作用,至少不是每次都起作用。不幸的是,我不能说为什么它不起作用,所以我正在寻找一种替代解决方案,如果有的话。
  • 嗯,没有。它不是。链接的帖子包含的代码比您在此处发布的要多得多,并且还包括注册第二个活动。您可能应该更仔细地阅读它。 (它也被接受了,这通常意味着提出问题的用户找到了可行的解决方案。)
  • 是的,它有更多代码,但只有在事件成功引发后执行的代码。所以它对任务并不重要。我也尝试了第二个事件,它没有帮助。我将在 OP 中添加它。

标签: powershell events shutdown


【解决方案1】:

以下代码不是对您的完整问题的回答,而是对您的标题问题的回答,并且可能会帮助那些只想停止已经超时的关闭的人:

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

我尽可能使用空格和分号来让我更清楚。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你看过这篇文章吗?

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

      他使用 wmi 来监视事件 Register-WmiEvent -Class win32_computerShutdownEvent

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2011-02-19
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多