Невозможно использовать API VIX для включения виртуальной машины, установки программного обеспечения с помощью msiexec, а затем для создания моментального снимка.

Я не знаю, как использовать VIX API для установки моего тестируемого программного обеспечения в рамках того, что, надеюсь, станет дополнением к моей непрерывной интеграции. Вот операции на высоком уровне:

  1. включите снимок виртуальной машины
  2. Установите пакет msi на виртуальную машину с помощью RunProgramInGuest (этот msi — мое тестируемое программное обеспечение)
  3. выключить виртуальную машину
  4. моментальный снимок

Теперь эти шаги работают нормально, если я сначала вручную войду в уже включенный снимок и просто запущу свою программу на шаге 2. Все просто работает. Однако, если я начну с шага 1 и позволю VIX включить моментальный снимок, мой RunProgramInGuest просто не сделает то, что обычно делал бы, если бы я уже вошел в систему.

В гостевой виртуальной машине у меня есть:

  • Файл .bat на рабочем столе, который вызывает задачу, созданную с помощью планировщика задач. Эта задача настроена на выполнение с наивысшими привилегиями. Я использую идеи из Использование VMRUN с Windows Vista и UAC. Хотя примечание: У меня UAC полностью отключен, так что проблема не в этом
  • Задача сверху запустит на рабочем столе другой файл .bat, который является моим сценарием установки, например. msiexec /i ...

Код, который запускает хост, который задыхается, если я еще не вошел в виртуальную машину:

using (VMWareVirtualHost virtualHost = new VMWareVirtualHost()) {
    virtualHost.ConnectToVMWareWorkstation();

    using (VMWareVirtualMachine virtualMachine = virtualHost.Open(@"D:\VMware-VMs\testvm-W7x86-3\testvm-W7x86-3.vmx"))
    {

        virtualMachine.PowerOn();
            virtualMachine.WaitForToolsInGuest();  
        virtualMachine.LoginInGuest("myusername", "myfakepassword");

        VMWareVirtualMachine.Process guestProcess = virtualMachine.RunProgramInGuest(@"C:\Windows\System32\cmd.exe", @"/c C:\Users\myusername\Desktop\StartTask.bat", Constants.VIX_RUNPROGRAM_ACTIVATE_WINDOW);
        Thread.Sleep(60000);
        virtualMachine.RunProgramInGuest(@"C:\Windows\System32\cmd.exe", @"/c C:\Windows\System32\shutdown.exe -s -t 0");
        Thread.Sleep(30000); //wait for guest to shutdown before continuing to make snapshot..

...и так далее

Мои вопросы:

  • Почему это работает только тогда, когда я уже вошел в уже включенную виртуальную машину?
  • Есть ли другой способ сделать это, помимо использования VIX API (например, с помощью Psexec.exe или чего-то подобного)? То, как это настраивается с использованием набора задач для запуска с наивысшими привилегиями, означает, что любая виртуальная машина, которую я хочу добавить в микс, должна иметь эту настройку задачи. Я рассматривал другие способы — RemoteInstall выглядит очень многообещающе, за исключением того, что вы должны отключить UAC, чтобы он работал. Так что теперь я прибегаю к этим хакерским обходным путям.

РЕДАКТИРОВАТЬ: такое же поведение возникает, если я использую vmrun.exe для запуска задачи. Если я уже не вошел в систему через удаленный сеанс, это не работает, например:

РЕДАКТИРОВАТЬ: такое же поведение возникает, если я использую sysinternals «PsExec.exe» для запуска программы на виртуальной машине — это работает, только если я уже вошел в интерактивный сеанс.

vmrun -T ws -gu myusername -gp myfakepassword runProgramInGuest D:\VMware-VMs\testvm-3\testvm-W7x86-3.vmx -activeWindow "C:\users\myusername\desktop\StartTask.bat"

person JohnZaj    schedule 08.09.2012    source источник


Ответы (2)


Из документов VMvare: «VIX_LOGIN_IN_GUEST_REQUIRE_INTERACTIVE_ENVIRONMENT следует использовать для обеспечения правильной работы функций CaptureScreenImage, OpenUrlInGuest и RunProgramInGuest».

Этот флаг предполагает, что виртуальная машина уже запущена и вы вошли в систему.

http://www.vmware.com/support/developer/vix-api/vix16_reference/lang/com/functions/LoginInGuest.html

person Ciprian    schedule 31.10.2012
comment
Ты прав. Мое решение состояло в том, чтобы временно настроить AutoLogon, а затем перезагрузить компьютер, чтобы вызвать интерактивный сеанс. Это оказалось более хакерским решением, чем я надеялся, но оно работает. - person JohnZaj; 31.10.2012
comment
Несколько заключительных замечаний: 1) Никогда не используйте AutoLogon на машинах, отличных от безопасного тестового домена (само собой разумеется). 2) отключите AutoLogon, как только вы получите интерактивный сеанс. 3) теоретически вы должны быть в состоянии достичь результата, если вы вместо этого запустите (может быть, даже свернутый?) сеанс удаленного рабочего стола на машине в то же время, вместо того, чтобы прыгать через обручи настройки и отключения AutoLogon - person JohnZaj; 08.04.2013

Существует фреймворк, который делает именно это, и вы можете свободно просматривать его исходный код: RemoteInstall

person shleimel    schedule 22.08.2013