Я использую гостевую ОС Ubuntu VM в автономном режиме на хосте Windows 7. Я написал пакетный скрипт, который использует VBoxManage для запуска или сохранения состояния виртуальной машины на основе переданного аргумента. Я могу нормально запустить виртуальную машину, поместив ярлык для скрипта в папку автозагрузки, но у меня возникают проблемы с приостановкой виртуальной машины при выходе из системы.
Я пробовал несколько разных методов:
- Создание записи сценариев выхода пользователя из системы в редакторе локальной групповой политики (gpedit.msc) запускает мой сценарий, но процесс VBoxManage сообщает, что виртуальная машина не работает. Я предполагаю, что процесс выхода из системы убивает виртуальную машину, прежде чем мой сценарий сможет добраться до нее.
- Создание задачи с помощью планировщика задач, которое запускается при событии 7002, которое, как мне сказали, является событием выхода из системы, запускает сценарий, но VBoxManage сообщает следующее:
VBoxManage.exe: ошибка: не удалось создать объект VirtualBox!
VBoxManage.exe: ошибка: код E_ACCESSDENIED (0x80070005) - ошибка общего доступа запрещена (расширенная информация недоступна)
VBoxManage.exe: ошибка: Скорее всего, COM-сервер VirtualBox не запущен или не запустился.
Есть ли лучший способ автоматически приостановить состояние виртуальной машины при выходе из Windows?
Содержание пакетного скрипта:
@echo off
setlocal
rem list of VMs to start/stop
set vm_list=Ubuntu
set action=%1
if not "%action%" == "start" if not "%action%" == "stop" exit /B
set command="C:\Program Files\Oracle\VirtualBox\VboxManage.exe"
set logfile="C:\bin\vm_log.txt"
if exist %logfile% echo.>> %logfile%
echo %date% %time%>> %logfile%
for %%A in (%vm_list%) do (
if "%action%" == "start" (
echo Starting %%A>> %logfile% 2>&1
%command% startvm %%A --type headless >> %logfile% 2>&1
) else if "%action%" == "stop" (
echo Suspending %%A>> %logfile% 2>&1
%command% controlvm %%A savestate >> %logfile% 2>&1
)
)
endlocal
У меня есть вывод команд, перенаправленных в vm_log.txt
который позволяет просматривать сообщения, о которых было сообщено.