是否可以检测是否已发出关机命令(通过用户的开始菜单,或计算机上运行的任何其他程序或远程访问计算机的程序),然后取消它?
或者,是否可以调整注册表以强制 Windows 在发出关机命令时显示关机计时器,以便我们得到一些禁用它的方法?
答案1
是的,(大多)不。
您可以检测关机事件。当 Windows 即将关机时,它会发送WM_QueryEndSession
到所有打开的应用程序。要检测到这种情况,您必须在后台运行脚本或程序来检测和处理事件。但是,似乎没有任何方法可以取消关机,除非关机是从本地机器和用户。
然后,脚本/应用程序可以捕获关机事件并询问您是否要退出脚本/应用程序,然后您可以取消。这将阻止机器关机,但不会阻止其他应用程序和可能服务被终止。
您甚至不需要脚本,只需打开记事本并输入一些文本即可。由于记事本中有未保存的数据,Windows 将等待并询问您是否要继续关机,让您有机会取消。同样,这仅在以下情况下才有效你本地启动了关闭。
有一个 WMIWin32_ComputerShutdownEvent
事件,当计算机通过以下方式关闭时发生:偏僻的命令。然而,它只能收到此事件。当收到该事件时,本地计算机将在事件传递时终止脚本。
答案2
这是针对 Windows 7(在企业环境中):如果管理员触发远程关机(shutdown /m PCName),Windows 7 应该显示一条通知,说明 PC 正在获取关机/重启指令并提供倒计时。
在 PC 上的用户可以取消它,假设用户在机器上也拥有管理员权限,运行以下命令:
shutdown /a
中止任何正在进行的现有关闭操作。
但如果管理员设置了 1 秒的计时器或立即关闭,这一点当然就没有意义了。
Windows 8 - 您会在系统托盘中收到一条通知(发出关机命令时),告知 Windows 将在 xxx 分钟后关机,关机时间/日期为 xxx。我相信在关机前 1 分钟,Windows 8 将显示一条全屏通知,告知您将在 60 秒后关机,您实际上必须单击“关闭”以确认该消息。
Windows XP - 我相信它也会显示计时器,但我无法确认,因为我没有 WinXP 机器可以测试。
再次,您可以通过上述命令取消所有“计划的”关机,但如果时间不够,您就无能为力了。
答案3
我也希望找到一种方法来做到这一点,以确保 postgreSQL 在终止之前有足够的时间正确关闭,但目前看起来并不十分有希望。
这基本上只是重述其他人的答案,但我在 Windows 7 上的管理员提示符下尝试了这两个命令:
shutdown /s & shutdown /a
shutdown /s /t 0 & shutdown /a
第一个命令按预期成功中止了关机,而第二个命令却没有。这证明克尔塔里关于无法中止立即关闭的声明shutdown /a
。