无法使用VIX api启动VM,使用msiexec安装软件,然后创建快照

时间:2012-09-08 23:01:20

标签: continuous-integration vix

我对如何使用VIX api安装我的测试软件感到茫然,这有望成为我持续集成的一部分。以下是高级别的操作:

  1. 启动VM快照
  2. 使用RunProgramInGuest在VM上安装msi软件包(此msi是我正在测试的软件)
  3. 关闭VM
  4. 拍摄快照
  5. 现在 - 如果我首先手动登录已启动的快照并在步骤2中启动我的程序,这些步骤可以正常工作。一切正常。但是,如果我从步骤1开始并允许VIX启动快照,我的RunProgramInGuest就不会执行我已经登录的通常

    在来宾VM中,我有:

    • 桌面上的.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..
    

    ......等等

    我的问题:

    • 为什么只有在我已经登录已启动的虚拟机时这才有效?
    • 除了使用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"
    

2 个答案:

答案 0 :(得分:1)

从VMvare文档:“VIX_LOGIN_IN_GUEST_REQUIRE_INTERACTIVE_ENVIRONMENT应该用于确保CaptureScreenImage,OpenUrlInGuest和RunProgramInGuest函数正常工作。”

此标志假定VM已在运行且您已登录。

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

答案 1 :(得分:0)

有一个框架可以完全实现,您可以自由浏览其源代码: RemoteInstall