我有一个批处理文件,它在 windows 启动时启动一个 VirtualBox VM,我想要一个在有人重新启动或关闭机器时自动保存 VM 状态的批处理文件。
我不能使用 GPO,因为它所做的一切都是在 Windows 杀死其他一切之后发生的。
那么有没有办法修改Windows如何处理这个或者可能以某种方式拦截关机/重启信号?
我有一个批处理文件,它在 windows 启动时启动一个 VirtualBox VM,我想要一个在有人重新启动或关闭机器时自动保存 VM 状态的批处理文件。
我不能使用 GPO,因为它所做的一切都是在 Windows 杀死其他一切之后发生的。
那么有没有办法修改Windows如何处理这个或者可能以某种方式拦截关机/重启信号?
我不久前找到了这个解决方案。它使用 python,所以它不是最轻量级的解决方案,但它对我有用。
- 在有写入权限的地方下载vbox-shutdown.py(除非您指定不同的路径,否则它将创建一个日志文件)。
- 与 VirtualBox 具有相同架构的 Python 2.7 - 如果您有 64 位系统,您很可能需要 64 位 Python(我使用了 COM api - 目前它不允许跨拱互操作)。如果有人真的想要这个,这可以通过使用命令行 API 来改变。任何人都可以修复它——它只是一些 Python 代码。
- 安装 pywin32 - 与上面相同的架构/原因。
- 安装 vboxapi 包。在 c:\Program Files\Oracle\VirtualBox\sdk\install\ 中运行 python vboxapisetup.py install 对我有用。我想知道为什么他们有这个没有发行版的无用 pypi 包......
- 现在只需运行 shell:startup 并将文件放在那里。
所有学分都归 ionelmc http://blog.ionelmc.ro/2014/01/04/virtualbox-vm-auto-shutdown/
好的,我能想出的最好的
以下 python 脚本将等待关机,中止它,调用您的脚本,然后重新启动关机。添加它以在启动时启动。
编辑需要 pywin32 python 扩展可用这里
1 问题是它不会从开始菜单或电源按钮中止关机。只有软件关闭。您可以像this和this那样禁用它们。如果您仍然希望能够手动关闭您的电脑,请添加一个名为ANYTHING BUT "SHUTDOWN"的批处理文件,其中包含以下内容
shutdown -f -s
蟒蛇脚本
import win32security
import win32api
import sys
import time
from ntsecuritycon import *
import os
import subprocess
Pre_ShutdownScript = "your Script"
Shutdown = True
# Get the process token
flags = TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), flags)
# Get the ID for the system shutdown privilege.
idd = win32security.LookupPrivilegeValue(None, SE_SHUTDOWN_NAME)
while Shutdown:
try:
win32security.AdjustTokenPrivileges(htoken, 0, [(idd, SE_PRIVILEGE_ENABLED)])
win32api.AbortSystemShutdown(None)
Shutdown = False
except:
win32security.AdjustTokenPrivileges(htoken, 0, [(idd, 0)])
time.sleep(1)
try:
subprocess.call([Pre_ShutdownScript])
except:
pass
os.system("shutdown -r -t 1")
5moufl 你说“我不能使用 GPO,因为它所做的一切都是在 Windows 杀死其他一切之后发生的”。您能否详细说明您尝试的本地组策略更改?有没有错误?什么不适合你?当 VM 在随后的重新启动时出现时发生了什么?
这里有关于将关闭操作定义为组策略的详细信息: http ://en.kioskea.net/faq/3358-execute-a-script-a-startup-and-shutdown :