0

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

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

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

想法1:

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

想法2:

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

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

理念3:

  • 嗅探传入的网络流量。
  • 寻找 shutdown -m 数据包
  • ...

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

想法4:

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

问题:我不知道是否以及在哪里记录。

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

4

2 回答 2

1

当您可以设置 Windows 关闭脚本时,为什么要更加努力?

这很容易:

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

截屏

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

更多在这里

编辑:

当您有关闭脚本并且您不想创建某些程序时,您可以检查关闭脚本是否存在某个文件,您创建的文件是否存在,如果不存在,则备份,如果是,则继续正常关闭并删除该文件。当您创建另一个脚本并将其放置在桌面或任何地方并对其进行编程以创建文件并运行shutdown.exe时,您将在没有备份的情况下正常关机,但如果服务器调用shutdown它将备份。

于 2017-03-15T20:14:19.313 回答
0

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

于 2017-03-21T07:15:53.843 回答