Я не знаю, как использовать VIX API для установки моего тестируемого программного обеспечения в рамках того, что, надеюсь, станет дополнением к моей непрерывной интеграции. Вот операции на высоком уровне:
- включите снимок виртуальной машины
- Установите пакет msi на виртуальную машину с помощью RunProgramInGuest (этот msi — мое тестируемое программное обеспечение)
- выключить виртуальную машину
- моментальный снимок
Теперь эти шаги работают нормально, если я сначала вручную войду в уже включенный снимок и просто запущу свою программу на шаге 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"