Continuous integration 无法使用VIX api打开VM电源,请使用msiexec安装软件,然后创建快照

Continuous integration 无法使用VIX api打开VM电源,请使用msiexec安装软件,然后创建快照,continuous-integration,vix,Continuous Integration,Vix,我不知道如何使用VIXAPI来安装我正在测试的软件,希望这将是我的持续集成的一部分。以下是高级别的操作: 打开虚拟机快照 使用RunProgramingTest在VM上安装msi包(此msi是我正在测试的软件) 关闭虚拟机 拍快照 现在-如果我首先手动登录到一个已经通电的快照,然后在步骤2中启动我的程序,那么这些步骤可以很好地工作。一切正常。但是,如果我从步骤1开始并允许VIX打开快照,我的RunProgramingTest就不会像我已经登录时那样正常运行 在来宾虚拟机中,我有: 桌面上的.b

我不知道如何使用VIXAPI来安装我正在测试的软件,希望这将是我的持续集成的一部分。以下是高级别的操作:

  • 打开虚拟机快照
  • 使用RunProgramingTest在VM上安装msi包(此msi是我正在测试的软件)
  • 关闭虚拟机
  • 拍快照
  • 现在-如果我首先手动登录到一个已经通电的快照,然后在步骤2中启动我的程序,那么这些步骤可以很好地工作。一切正常。但是,如果我从步骤1开始并允许VIX打开快照,我的RunProgramingTest就不会像我已经登录时那样正常运行

    在来宾虚拟机中,我有:

    • 桌面上的.bat文件,用于调用通过任务调度器创建的任务。此任务设置为以最高权限运行。我正在使用来自的想法。尽管注意:我现在已经完全关闭了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才能工作。所以我现在求助于这些黑客的变通方法
    编辑:如果使用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"
    
    来自VMvare文档:“应使用VIX_登录_IN_GUEST_REQUIRE_INTERACTIVE_环境,以确保CaptureScreenImage、OpenUrlInGuest和RunProgramInGuest功能正常工作。”

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


    有一个框架可以做到这一点,您可以自由浏览其源代码:

    你说得对。我的解决方案是临时设置自动登录,然后重新启动以强制交互式会话。结果证明,这是一个比我所希望的更为黑客化的解决方案,但它确实有效。最后几点注意事项:1)除了安全的测试域之外,永远不要在机器上使用自动登录(应该不言而喻)。2) 一旦您获得交互式会话,请立即拆除自动登录。3) 从理论上讲,如果您同时向机器启动一个远程桌面会话(甚至可能最小化),而不是跳过设置和拆卸AutoLogon的过程,那么您应该能够实现这个结果