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

12

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

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

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

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

Андерсон Грин
источник

Ответы:

15

У гостей 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, это не будет работать. Информацию об ограничениях и о том, как настроить 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и установка его в ноль приведет к тому же эффекту, согласно этому ответу .

Takkat
источник
Каждую из этих команд следует запускать из командной строки Windows или из командной строки Ubuntu?
Андерсон Грин
Довольно приятная концепция, хотя мне почему-то никогда не нравился бесшовный режим - возможно, потому, что он путает навигацию с помощью клавиатуры. Но я испытываю желание попробовать кое-что из этого для моих немногих программ Windows, которые я все еще использую, таких как Quicken и iTunes. @AndersonGreen: он запускается из командной строки Ubuntu и может быть легко введен в терминал для тестирования, а затем превращен в скрипт.
Марти Фрид
Должен ли пароль (вводимый в сценарии) быть паролем для входа в Windows или паролем для входа в Ubuntu?
Андерсон Грин
Это пароль Windows, который вам нужен, поскольку вы, вероятно, вошли в Ubuntu, и для запуска виртуальной машины не требуется root-доступ. Обратите внимание, что вам нужен пароль Windows и войдите, чтобы это работало.
Таккат
Если это будет работать в противоположной усадьбе (под управлением Windows в качестве основной ОС и Linux в качестве виртуальной машины)
Уильям
3

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

Вы, вероятно, должны посмотреть на это . Согласно документации, эта команда запускается с хост-ОС (я предполагаю, что хост 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

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

Хавьер Ривера
источник
Интересные идеи, и я думаю, что это может быть использовано как еще один способ выполнить задачу. Гость может быть запущен с хоста, а затем, когда он запущен, возможно, команда будет работать для запуска команды. Для программиста это может быть проще, чем моя идея; он включает в себя использование «сна» в цикле, чтобы подождать, пока виртуальная машина будет работать, но все это можно сделать с хоста с помощью одного скрипта.
Марти Фрид
Я только что попробовал вашу первую команду execute и смог запустить Quicken с моей первой попытки с уже работающей виртуальной машины Windows XP с именем «Windows XP», используя эту команду из командной строки терминала Ubuntu:, VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXгде XXXXX - мои имя пользователя и пароль.
Марти Фрид
Может быть, моя проблема в том, что я использую учетную запись без пароля.
Хавьер Ривера
Возможно ... Я просто изменил команду, которую я запустил, чтобы использовать ваш формат, и она действительно запустила regedit.
Марти Фрид
Таккат сказал, что он не работает в учетных записях без пароля, как у меня. Это объясняет, почему я никогда не был в состоянии сделать это;).
Хавьер Ривера
2

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

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

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

Марти Фрид
источник
Я хотел бы создать ярлык для Visual Studio и ярлык для Internet Explorer, который можно вызывать с рабочего стола Ubuntu (чтобы они работали на виртуальной машине). Можно ли это сделать, используя метод, который вы описали?
Андерсон Грин
Я хотел бы знать, можно ли сделать обратное - запустить хост-приложение (такое как Kolourpaint) из гостевой операционной системы.
Андерсон Грин
Можно ли сделать обратное с помощью гостевых дополнений?
Андерсон Грин
Кроме того, вы имеете в виду загрузочную папку Windows или список загрузочных приложений Ubuntu?
Андерсон Грин
Извините, я понял, что моя первая идея была ошибочной, потому что папка windows не существует до тех пор, пока виртуальная машина не будет запущена. Я полностью пересмотрел свой ответ и надеюсь, что он не слишком запутанный.
Марти Фрид
1

Я хотел то же самое и закончил тем, что решил без использования 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-сценарии на клиенте. Прекрасно работает, и я думаю, что это соответствует идее Мартиса в предыдущем посте.

городской
источник
Вы проверяли это на хосте Ubuntu?
user68186
Нет, но я уверен, что это будет работать без глюков. Команды vbox такие же, как и bash.
Urban
Безопаснее использовать pgrepвместо ps | grep. Последний рискует сопоставить себя.
Муру
Да, ты прав. Я считаю, что исправили это выше, используя ps, добавив дополнительный grep -v, чтобы отфильтровать проблему самосогласования. Я не мог понять, как использовать pgrep, как вы предложили в этом случае, поскольку имя VBox «Windows 7» в моем случае является аргументом комментария к процессу, например так: MacMini:~ urban$ ps ax | grep -v grep | grep 'Windows 7' 10874 ?? R 4:38.49 /Applications/VirtualBox.app/Contents/Resources/VirtualBoxVM.app/Contents/MacOS/VirtualBoxVM --comment Windows 7 --startvm 24507412-789d-42ed-9c79-b4faf0c2d130 --no-startvm-errormsgboxно, может быть, у вас есть предложение по этому поводу ?
Urban