【发布时间】:2017-03-09 21:24:19
【问题描述】:
我有一台知道何时停电的主计算机。然后,该主计算机将使用内置的“shutdown /m \computername /s”命令告诉所有工作站通过网络关闭。
该主计算机还将使用相同的shutdown /m \\computername /r 机制告诉各个工作站重新启动。
每个工作站都有一个脚本,执行时会保存所有重要数据。
当被告知通过网络(shutdown /m \\computername /s 或shutdown /m \\computername /r)关闭或重新启动时,每个工作站都必须执行其脚本。
想法1:
- 使用 WM_QUERYENDSESSION 事件查明何时发生关机/重启。
- 取消关机/重启。
- 运行脚本。
- 继续关机/重启(问题:我没有找到合理的方法来确定主计算机是否已发出关机或重启。)
想法2:
- 等到shutdown.exe进程存在。
- 检索该进程的命令行参数
- 杀死该进程
- 运行脚本。
- 使用检索到的参数运行 shutdown.exe。
问题:shutdown.exe 实际上并没有被执行。即使您在本地运行一个简单的shutdown -s -t 30,也不会。
想法3:
- 嗅探传入的网络流量。
- 寻找关闭 -m 数据包
- ...
问题:我不知道正在使用什么协议以及数据包的格式。
想法4:
- 监控事件日志
- 希望它包含有关已发出何种关闭的信息
问题:我不知道是否会记录以及在哪里记录。
PS:
我不想使用 PsExec。工作站必须自己执行脚本。
【问题讨论】:
-
最好在超级用户和/或服务器故障中询问
-
我的问题非常具体到编程。
-
如果这是关于编程,为什么不编写自己的关机协议,由安装在所有机器上的特定 .exe 实现,而不是使用 shutdown.exe 呢?
-
因为要使用官方的shutdown /m接口。
-
为什么不把idea 1和idea 2结合起来呢?您可以确定关机是否是由主计算机发送的,因为如果它是由主计算机发送的,shutdown.exe 将不会出现。这是一个有点粗略的解决方案,但它可能会奏效。编辑:这是一条评论,因为我对所有这些东西的工作原理知之甚少,无法自信地给出完整的答案。
标签: windows command-line shutdown shutdown-hook system-shutdown