找出何时执行shutdown -s

时间:2017-03-09 21:24:19

标签: windows command-line shutdown shutdown-hook system-shutdown

我有一台主计算机知道什么时候停电。然后,主计算机将使用内置的“shutdown / m \ computername / s”命令告诉所有工作站通过网络关闭。 该主计算机还将告诉各个工作站使用相同的shutdown /m \\computername /r机制重新启动。

每个工作站都有一个脚本,在执行时会保存所有重要数据。

每个工作站在被告知要通过网络关闭或重新启动时都必须执行其脚本(shutdown /m \\computername /sshutdown /m \\computername /r)。

Idea1:

  • 使用WM_QUERYENDSESSION事件找出关闭/重启的时间。
  • 取消关机/重启。
  • 运行脚本。
  • 继续关机/重启(问题:我看不出合理的方法来确定主计算机是否已发出关机或重启。)

Idea2:

  • 等到shutdown.exe进程存在。
  • 检索该进程的命令行参数
  • 杀死该过程
  • 运行脚本。
  • 使用检索到的参数运行shutdown.exe。

问题:shutdown.exe实际上没有被执行。即使您在本地运行简单的shutdown -s -t 30也不行。

Idea3:

  • 嗅探传入的网络流量。
  • 查找shutdown -m packets
  • ...

问题:我不知道正在使用什么协议以及如何格式化数据包。

Idea4:

  • 监控事件日志
  • 希望它包含有关已发出何种关闭的信息

问题:我不知道是否会记录这些内容。

PS:
我不想使用PsExec。工作站必须自己执行脚本。

2 个答案:

答案 0 :(得分:1)

为什么只需设置Windows关闭脚本就可以更难?

这很简单:

执行gpedit.msc(本地政策),然后转到: Windows设置 - >脚本 - >关机 - >属性 - >添加,然后添加您的脚本。它将执行始终关闭。如果只想从服务器端调用shutdown时运行它,最好创建非常简单的c#(或其他)程序来运行脚本然后关闭计算机。完成后,您可以从服务器调用它。

screenshot

警告:使用fastboot时,组策略启动和关闭scipts未执行(在Windows 8及更高版本中默认启用)。在这种情况下,只有重启或强制关闭(从命令提示符)真正关闭计算机。在所有其他情况下(开始菜单关闭),计算机内核休眠,并在启动时恢复,并忽略GPO启动和关闭scipts。

更多here

修改

如果你有关机脚本并且你不想创建一些程序,你可以检查关机脚本,如果是某个文件,你创建的是什么,如果没有,那么备份,如果是,继续正常关机和删除这个文件。如果你有这个创建另一个脚本并将其放在桌面或任何地方并编程它以创建文件和运行shutdown.exe,所以你将没有备份正常关闭,但如果服务器调用关闭它将备份。

答案 1 :(得分:0)

您可以在每个工作站中一个正在运行的应用程序中检测Windows关闭,例如c#.net,然后在关闭之前运行您的脚本,然后继续关闭。将事件处理程序方法附加到SystemEvents.SessionEnded事件。 看看here