Запустите приложение в Windows с рабочего стола Ubuntu

Я хотел бы написать сценарий оболочки в Ubuntu, который делает следующее:

  1. Загрузите гостевую ОС Windows 7 в Virtualbox, если она еще не запущена.

  2. Запустите сценарий оболочки в Windows, где сценарий оболочки вызывается из операционной системы хоста Ubuntu.

Моя цель - создать панель запуска приложений на рабочем столе хоста Ubuntu для приложения в гостевой ОС. Например, я мог бы создать ярлык для Visual Studio на рабочем столе Ubuntu, который запускает Visual Studio в Windows. Я всегда хотел иметь возможность запускать приложения Windows прямо с рабочего стола Ubuntu, вместо того, чтобы ждать запуска Windows, прежде чем щелкнуть ярлык приложения.

4 ответа

Решение

У гостей Windows есть некоторые ограничения, но для запуска гостевого приложения в бесшовном режиме из сценария, который можно поместить в программу запуска, мы протестировали следующую процедуру:

  • Запустите VirtualBox Manager
  • Войдите в Windows с вашим именем пользователя и паролем
  • Переключиться в бесшовный режим Host + L
  • В бесшовном режиме сохранить состояние машины

Теперь мы можем получить полный контроль командной строки над виртуальной машиной с помощью следующих команд:

  • Запустите виртуальную машину из плавного сохранения

    VBoxManage startvm "<Name_of_VM>"
    

    или (для интерфейса Qt)

    VirtualBox --startvm "<Name_of_VM>"
    
  • Запустить приложение в ВМ

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
    
  • Завершить ВМ в состоянии сохранения

    VBoxManage controlvm "Name_of_VM" savestate
    

Поместите их в сценарий, чтобы наслаждаться бесшовными окнами приложений Windows на рабочем столе Ubuntu.

Если вы настроили пароль для входа в систему без пароля, это не сработает. Информацию об ограничениях и о том, как настроить Windows, чтобы она работала, см. В руководстве по Virtual Box

Кроме того, для использования учетных записей без или с пустым паролем необходимо изменить групповую политику гостя. Для этого откройте редактор групповой политики в командной строке, набрав gpedit.msc, откройте ключ Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options и изменить значение Accounts: Limit local account use of blank passwords to console logon only для инвалидов.

В операционных системах без редактора групповой политики (gpedit.msc), таких как домашние выпуски Windows, создание DWORD в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduse и установив его на ноль, вы получите тот же эффект, согласно этому ответу.

Это скорее подсказка, чем ответ, но слишком велик для комментария.

Вы, вероятно, должны посмотреть на это. Согласно документации, эта команда запускается с хост-ОС (я предполагаю, что хост Ubuntu и гость Windows):

VBoxManage guestcontrol "Windows XP Pro" execute --image "cmd.exe" --username javier --verbose "/c" "regedit.exe"

Должен открыть regedit в Windows (гость), но я так и не смог заставить его работать.

Вы также можете использовать

VBoxManage showvminfo "Windows XP Pro" | grep State

проверить, работает ли виртуальная машина или нет.

Я удалил оригинальную идею, когда понял, что она не будет работать, потому что Linux не сможет получить доступ к разделу Windows на виртуальной машине, если она еще не запущена. Может быть более сложный способ сделать это, но я не знаю, действительно ли это того стоит.

Может быть целесообразным иметь общий общий каталог, и сценарий в Windows всегда проверяет этот каталог, чтобы определить, пуст он или нет. Если нет, он запустит сценарии в каталоге, который будет помещен туда системой Ubuntu перед запуском виртуальной машины.

У вас может быть второй скрипт, который удаляет первый, чтобы он не запускался в следующий раз.

Я хотел то же самое и закончил тем, что решил без использования guestcontrol. На моем хосте MacOS X у меня есть папка (называемая Windows), которую мой клиент vbox с Win7 отобразил как Z:. Я использую фиктивные файлы для связи между хостом и моими клиентами следующим образом:

На хосте Mac: - создал один shell-скрипт с иконкой для каждого приложения Windows, которое я хотел запустить в Win-клиенте. Что они в основном делают, так это проверяют, что VirtualBox не запускался раньше, а затем создают файл "Запустить это конкретное приложение" в общей папке, которую Windows может прочитать после запуска. Пример того, как выглядит такой скрипт:

#!/bin/bash

# bail if vbox is already started/running windoze...
ps ax | grep -v grep | grep 'Windows 7' > /dev/null
if [ $? -eq 0 ]; then
  echo "Sorry, Windows is already running."
  exit 0
fi

# send a message to Windoze which program to start...
touch /Users/urban/Documents/Windows/START_TS2000I.TXT

# startup Windoze in seamless mode
vboxmanage setextradata 'Windows 7' GUI/Seamless on
vboxmanage startvm 'Windows 7' &

exit 0

Затем в Windows-клиенте у меня есть соответствующий скрипт (BAT-файл) в папке автозагрузки, который выглядит следующим образом:

@echo off
pushd "C:\Program Files\Omega Research\Program"
if exist Z:\start_ts2000i.txt start ORTrade.exe
if exist Z:\start_ts2000i.txt del Z:\start_ts2000i.txt
.
.
.
exit 0

Таким образом, в любое время, когда я хочу добавить новый значок запуска клиента на моем Mac, я копирую сценарий оболочки, изобретаю новый фиктивный файл и добавляю соответствующие строки запуска в BAT-сценарии на клиенте. Прекрасно работает, и я думаю, что это соответствует идее Мартиса в предыдущем посте.

Другие вопросы по тегам