Я использую гостевую ОС Ubuntu VM в автономном режиме на хосте Windows 7. Я написал пакетный скрипт, который использует VBoxManage для запуска или сохранения состояния виртуальной машины на основе переданного аргумента. Я могу нормально запустить виртуальную машину, поместив ярлык для скрипта в папку автозагрузки, но у меня возникают проблемы с приостановкой виртуальной машины при выходе из системы.

Я пробовал несколько разных методов:

  1. Создание записи сценариев выхода пользователя из системы в редакторе локальной групповой политики (gpedit.msc) запускает мой сценарий, но процесс VBoxManage сообщает, что виртуальная машина не работает. Я предполагаю, что процесс выхода из системы убивает виртуальную машину, прежде чем мой сценарий сможет добраться до нее.
  2. Создание задачи с помощью планировщика задач, которое запускается при событии 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 который позволяет просматривать сообщения, о которых было сообщено.

0