3

VIX API を使用して、継続的インテグレーションに追加されることを期待するものの一部として、テスト対象のソフトウェアをインストールする方法に途方に暮れています。大まかな操作は次のとおりです。

  1. VM スナップショットの電源を入れる
  2. RunProgramInGuest を使用して VM に msi パッケージをインストールします (この msi はテスト対象のソフトウェアです)。
  3. VM をシャットダウンする
  4. スナップショットを撮ります

ここで、これらの手順は、最初に既に電源がオンになっているスナップショットに手動でログインし、手順 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..

...など

私の質問:

  • すでに電源がオンになっている 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"
4

2 に答える 2

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

于 2012-10-31T07:00:55.443 に答える