我不知道如何使用 VIX api 来安装我的被测软件,这有望成为我持续集成的补充。以下是高级别的操作:
- 打开虚拟机快照
- 使用 RunProgramInGuest 在 VM 上安装 msi 包(此 msi 是我正在测试的软件)
- 关闭虚拟机
- 拍摄快照
现在 - 如果我首先手动登录到已经开机的快照并在步骤 2 中启动我的程序,这些步骤可以正常工作。一切正常。但是,如果我从第 1 步开始并允许 VIX 启动快照,我的 RunProgramInGuest 就不会像我已经登录的情况下那样做
在来宾虚拟机中,我有:
- 桌面上的 .bat 文件,它调用通过任务计划程序创建的任务。此任务设置为以最高权限运行。我正在使用Using VMRUN with Windows Vista and UAC中的想法。虽然注意:我现在完全关闭了 UAC,所以这不是问题
- 上面的任务将在桌面上运行一个不同的 .bat 文件,这是我的安装脚本,例如 msiexec /i ...
除非我已经登录到 VM,否则主机运行的代码令人窒息:
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..
...等等
我的问题:
- 为什么这仅在我已经登录到已启动的 VM 时才有效?
- 除了使用 VIX api(例如使用 Psexec.exe 或类似的东西)之外,我还有其他方法吗?使用任务集设置以使用最高权限运行的方式 - 这意味着我想要混合的任何 VM 都必须设置此任务。我已经研究过其他方法——RemoteInstall 看起来很有希望,除非你必须关闭 UAC 才能使其工作。所以我现在求助于这些 hacky 解决方法。
编辑:如果我使用 vmrun.exe 启动任务,也会发生相同的行为。除非我已经通过远程会话登录到机器,否则它不起作用,例如:
编辑:如果我使用 sysinternals 'PsExec.exe' 在 VM 中运行程序,则会发生相同的行为 - 它仅在我已经登录到交互式会话时才有效。
vmrun -T ws -gu myusername -gp myfakepassword runProgramInGuest D:\VMware-VMs\testvm-3\testvm-W7x86-3.vmx -activeWindow "C:\users\myusername\desktop\StartTask.bat"