0

我有一个批处理文件,它在 windows 启动时启动一个 VirtualBox VM,我想要一个在有人重新启动或关闭机器时自动保存 VM 状态的批处理文件。

我不能使用 GPO,因为它所做的一切都是在 Windows 杀死其他一切之后发生的。

那么有没有办法修改Windows如何处理这个或者可能以某种方式拦截关机/重启信号?

4

3 回答 3

1

我不久前找到了这个解决方案。它使用 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/

于 2015-03-21T10:19:37.847 回答
0

好的,我能想出的最好的

以下 python 脚本将等待关机,中止它,调用您的脚本,然后重新启动关机。添加它以在启动时启动。

编辑需要 pywin32 python 扩展可用这里

1 问题是它不会从开始菜单或电源按钮中止关机。只有软件关闭。您可以像thisthis那样禁用它们。如果您仍然希望能够手动关闭您的电脑,请添加一个名为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")
于 2012-06-21T16:20:06.677 回答
0

5moufl 你说“我不能使用 GPO,因为它所做的一切都是在 Windows 杀死其他一切之后发生的”。您能否详细说明您尝试的本地组策略更改?有没有错误?什么不适合你?当 VM 在随后的重新启动时出现时发生了什么?

这里有关于将关闭操作定义为组策略的详细信息: http ://en.kioskea.net/faq/3358-execute-a-script-a-startup-and-shutdown :

  • 开始菜单 > 运行 > 键入 gpedit.msc
  • 计算机配置 > Windows
  • 设置 > 脚本(启动/关闭)
  • 双击关机,弹出属性窗口
  • 单击添加 > 浏览以添加关闭脚本
  • 关闭 BAT 脚本可能是:“C:\Program Files\Oracle\VirtualBox\VBoxManage.exe” controlvm MyVM savestate
于 2014-03-08T05:40:35.670 回答