使用 VBoxManage guestcontrol 从 Ubuntu 23.04/23.10 打开 Windows 10 虚拟机上的应用程序

TVG*_*TVG 5 command-line virtualbox guest-additions 23.04 23.10

VBoxManage guestcontrol [vmname] 运行/启动

我设法使用以下命令从 Ubuntu 23.04 主机在 Windows 10 来宾虚拟机上打开计算器:

VBoxManage guestcontrol $MY_VM_NAME run --exe "C:\\Windows\\System32\\calc.exe" --username $MY_USERNAME --password $MY_PASSWORD
Run Code Online (Sandbox Code Playgroud)

问题

但是,当对WordPadMicrosoft Office 应用程序Adob​​e Acrobat Reader执行相同操作时,它不起作用:

VBoxManage guestcontrol $MY_VM_NAME run --exe "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe" --username $MY_USERNAME --password $MY_PASSWORD
Run Code Online (Sandbox Code Playgroud)

注:runstart给出相同的结果。

细节

在Ubuntu主机上,当我执行最后一个命令时,光标闪烁并且提示符从未返回。在 Windows 10 VM 中,查看任务管理器,我注意到应用程序(本例中为写字板)出现在后台进程列表中。当我尝试使用相同的命令执行我已转换为 .exe 文件而不是应用程序的个人脚本时,我习惯在来宾 Windows“终端”中看到的输出出现在主机 Ubuntu 终端中(请参阅下面的测试部分)。这就像guestcontrol进程尝试将应用程序的输出重定向到主机一样。但是,我不知道为什么打开计算器时没有问题。

在此输入图像描述

使用该--verbose选项返回:

$ VBoxManage guestcontrol $MY_VM_NAME start --verbose --exe "C:\\Windows\\System32\\calc.exe" --username $MY_USERNAME --password $MY_PASSWORD
Executing:
  Image : C:\Windows\System32\calc.exe
  arg[0]: C:\Windows\System32\calc.exe
Creating guest session as user 'toto'...
Waiting for guest session to start...
Successfully started guest session (ID 8)
Starting guest process ...
[1284 - Session 8]
Wait result is 'started' (1)
Process successfully started!
Guest session detached

$ VBoxManage guestcontrol $MY_VM_NAME start --verbose --exe "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe" --username $MY_USERNAME --password $MY_PASSWORD
Executing:
  Image : C:\Program Files\Windows NT\Accessories\wordpad.exe
  arg[0]: C:\Program Files\Windows NT\Accessories\wordpad.exe
Creating guest session as user 'toto'...
Waiting for guest session to start...
Successfully started guest session (ID 9)
Starting guest process ...
[8812 - Session 9]
Wait result is 'started' (1)
Process successfully started!
Guest session detached
Run Code Online (Sandbox Code Playgroud)

Ubuntu、Windows 和 VirtualBox 测试版本

我对 VirtualBox v6.1 和 v7.0 都得到了相同的结果。我还尝试过使用从Win10_21H2_English_x64.iso和创建的虚拟机Win10_22H2_English_x64v1.iso。但是,无论 VirtualBox 的版本如何,如果我使用Ubuntu 22.04,那么它都可以完美运行。

编辑 1: Ubuntu 23.10上的行为与Ubuntu 23.04上的行为完全相同。

编辑2: VirtualBox v7.0.12问题仍然存在。

测试

我创建了一个 HelloWorld 脚本,并将其转换为客户机上的可执行文件。楼主,当我这样做的时候

toto@toto-pc:~$ VBoxManage guestcontrol $MY_VM_NAME run --exe "C:\\Users\\Toto\\Desktop\\runapp\\runHello.exe" --username $MY_USERNAME --password $MY_PASSWORD
Hello, World!
toto@toto-pc:~$
Run Code Online (Sandbox Code Playgroud)

请注意“你好,世界!” 显示在我的主机而不是访客的终端中。

Raf*_*ffa 5

前言

这个答案只是提供信息,并不旨在成为问题的完整解决方案......尽管,它可能是。

Ubuntu 方面的事情

该实用程序有两个相似的命令guestcontrolrun但略有不同......来自VBoxManage guestcontrolstart的文档:

在来宾上运行命令

VBox管理访客控制
运行 [--arg0=参数 0] [--domain=域名] [--dos2unix]
[--exe=文件名] [--忽略孤立进程] [ --no-wait-stderr |
--wait-stderr ] [ --no-wait-stdout | --wait-stderr ] [ --no-wait-stdout | --wait-stderr ] --wait-stdout ] [ --passwordfile=密码文件 | --wait-stdout ] --password=密码] [--profile] [--putenv=var-name=[值]] [--quiet] [--timeout=msec] [--unix2dos]
[--unquoted-args] [--username=用户名] [--verbose]

VBoxManage guestcontrol vmname run命令使您能够在来宾 VM 上执行程序。标准输入、标准输出和标准错误从虚拟机重定向到主机系统,直到程序完成。

... 和:

在来宾上启动命令

VBoxManage guestcontrol start [--arg0=参数 0] [--domain=域名]
[--exe=文件名] [--忽略孤立进程] [
--passwordfile=密码文件 | --password=密码] [--profile] [--putenv=var-name=[值]] [--quiet] [--timeout=msec]
[--unquoted-args] [--username=用户名] [--verbose]

VBoxManage guestcontrol vmname start命令使您能够执行来宾程序直至其完成。

...因此,正如您所看到的,您应该使用后者start,因为前者将保持来宾进程的标准 I/O 流打开并将它们重定向到主机上的终端(或更准确地说连接它们),从而导致一些应用程序在启动之前可以接受/期望输入,就像在“写字板”的情况下要打开的文件参数一样,继续等待,而不是完全加载并保持主机终端中的提示......而像“计算器”这样的简单应用程序似乎不知道这些 I/O 流,会立即断开它们的连接并启动(即,就主机上的进程所知,来宾上的命令已终止,并且 I/O 流已终止)断开连接,因此终端中的提示被释放并恢复)。

Windows 方面的事情

有限制... Windows 操作系统对图形应用程序施加了某些限制。请参阅第 14 章,已知限制...其中包括:

宾客控制。在 Windows 来宾上,使用来宾控制执行支持启动的进程将无法显示图形用户界面,除非运行该进程的用户帐户当前已登录并具有桌面会话。

... 和:

此外,要使用没有或有空密码的帐户,必须更改访客的组策略。为此,请在命令行上键入 来打开组策略编辑器gpedit.msc,打开计算机配置\Windows 设置\安全设置\本地策略\安全选项项,然后更改帐户的值:限制本地帐户使用空白密码进行控制台登录仅限残疾人。

...以及其他可能导致影响 GUI 应用程序问题的实验性功能:

某些 Oracle VM VirtualBox 功能被标记为实验性的。此类功能按“原样”提供,未得到正式支持。不过,欢迎提供有关此类功能的反馈和建议。实验功能的综合列表如下:

  • 针对 Windows、Linux 和 Oracle Solaris 客户机的硬件 3D 加速支持

  • Windows 虚拟机的硬件 2D 视频播放加速支持

  • ICH9芯片组仿真

  • 电喷固件

  • 在同一主机上使用 Oracle VM VirtualBox 和 Hyper-V

我的建议

使用可用选项--verbose查看实际发生的情况(来宾端的报告可能会受到 Windows 选择报告或不报告的内容的限制),例如:

VBoxManage guestcontrol $MY_VM_NAME start --verbose \
--exe "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe" \
--username $MY_USERNAME --password $MY_PASSWORD
Run Code Online (Sandbox Code Playgroud)


TVG*_*TVG 1

解决方案

该问题来自VirtualBox Guest Additions v7。降级到v6版本解决问题。

细节

  • 主机操作系统:Ubuntu 23.10
  • 来宾操作系统:Windows 10
  • 虚拟盒:v7.0.10
  1. 在 Windows 10 VM 中,卸载Oracle VM VirtualBox Guest Additions(控制面板 > 卸载程序)。
  2. 关闭虚拟机电源。
  3. 从此处下载旧版本 VirtualBox Guest Additions 的 ISO 文件。与 一起工作VBoxGuestAdditions_6.1.48.iso
  4. (可选)将 ISO 文件保存在~/.config/VirtualBox/.
  5. 在 VirtualBox Manager 中,选择SATA 端口 1 的 ISO 文件: [Optical Drive] VBoxGuestAdditions_6.1.48.iso
  6. 启动虚拟机。
  7. 在“此电脑”下,双击CD Drive (D:) VirtualBox Guest Additions,然后VBoxWindowsAdditions.exe按说明安装 VirtualBox Guest Additions v6.1.48。

笔记

VirtualBox Guest Additions v7 似乎都不起作用。然后,由于只有 VirtualBox Guest Additions v6 可以工作,因此最好也使用 VirtualBox v6 而不是 VirtualBox v7。