Starten Sie eine Anwendung in Windows vom Ubuntu-Desktop

12

Ich möchte ein Shell-Skript in Ubuntu schreiben, das folgendes tut:

  1. Starten Sie ein Windows 7-Gastbetriebssystem in Virtualbox, sofern es noch nicht ausgeführt wird.

  2. Führen Sie ein Shell-Skript in Windows aus, wobei das Shell-Skript vom Ubuntu-Host-Betriebssystem aufgerufen wird.

Mein Ziel ist es, einen Anwendungsstarter auf dem Ubuntu-Host-Desktop für eine Anwendung auf dem Gastbetriebssystem zu erstellen. Beispielsweise könnte ich eine Verknüpfung für Visual Studio auf dem Ubuntu-Desktop erstellen, mit der Visual Studio unter Windows gestartet wird. Ich wollte schon immer Windows-Anwendungen direkt vom Ubuntu-Desktop starten können, anstatt darauf zu warten, dass Windows gestartet wird, bevor ich auf eine Anwendungsverknüpfung klicke.

Anderson Green
quelle

Antworten:

15

Die Windows-Gäste haben einige Einschränkungen, aber um eine Gastanwendung im Seamless-Modus über ein Skript auszuführen, das in einem Launcher abgelegt werden kann, haben wir das folgende Verfahren getestet:

  • Starten Sie den VirtualBox Manager
  • Melden Sie sich mit Ihrem Benutzer und Kennwort bei Windows an
  • Wechseln Sie in den Seamless-Modus Host+L
  • Speichern Sie im Seamless-Modus den Maschinenzustand

Jetzt können wir mit den folgenden Befehlen die vollständige Befehlszeilensteuerung über die virtuelle Maschine erhalten:

  • Starten Sie die virtuelle Maschine aus dem nahtlosen Speicherstatus

    VBoxManage startvm "<Name_of_VM>"

    oder (für das Qt-Frontend)

    VirtualBox --startvm "<Name_of_VM>"
  • Führen Sie eine Anwendung in der VM aus

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Beenden Sie die VM im Sicherungszustand

    VBoxManage controlvm "Name_of_VM" savestate

Fügen Sie diese in ein Skript ein, um nahtlose Windows-Anwendungsfenster auf Ihrem Ubuntu-Desktop zu genießen.

Falls Sie eine kennwortlose Windows-Anmeldung eingerichtet haben, funktioniert dies nicht. Weitere Informationen zu Einschränkungen und zur Konfiguration von Windows finden Sie im Handbuch zu Virtual Box .

Um Konten ohne oder mit einem leeren Kennwort zu verwenden, muss die Gruppenrichtlinie des Gasts geändert werden. Öffnen Sie dazu den Gruppenrichtlinien-Editor in der Befehlszeile, indem Sie gpedit.msc eingeben , den Schlüssel öffnen Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionsund den Wert von Accounts: Limit local account use of blank passwords to console logon onlyin Deaktiviert ändern .

Auf Systemen ohne den Gruppenrichtlinien - Editor (gpedit.msc), wie Home - Editionen von Windows, die Schaffung eines DWORD in dem Registrierungsschlüssel Betrieb HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduseund Einstellung auf Null wird die gleiche Wirkung erzielen, nach dieser Antwort .

Takkat
quelle
Sollte jeder dieser Befehle über die Windows-Befehlszeile oder die Ubuntu-Befehlszeile ausgeführt werden?
Anderson Green
Ziemlich nettes Konzept, obwohl ich den Seamless-Modus aus irgendeinem Grund nie wirklich gemocht habe - wahrscheinlich, weil es bei der Tastaturnavigation verwirrend wird. Aber ich bin versucht, einiges davon für meine wenigen Windows-Programme auszuprobieren, die ich noch benutze, wie Quicken und iTunes. @AndersonGreen: Wird über die Ubuntu-Befehlszeile ausgeführt und kann zum Testen einfach in ein Terminal eingegeben und dann in ein Skript umgewandelt werden.
Marty Fried
Sollte das Kennwort (das im Skript eingegeben wird) das Windows-Anmeldekennwort oder das Ubuntu-Anmeldekennwort sein?
Anderson Green
Dies ist das Windows-Kennwort, das Sie benötigen, da Sie wahrscheinlich bei Ubuntu angemeldet sind. Zum Starten einer VM sollte kein Root-Zugriff erforderlich sein. Beachten Sie, dass Sie ein Windows-Kennwort und eine Anmeldung benötigen, damit dies funktioniert.
Takkat
Sollte dies auf der anderen Seite funktionieren (Windows als Hauptbetriebssystem und Linux als virtuelle Maschine)
William
3

Dies ist eher ein Hinweis als eine Antwort, aber für einen Kommentar zu groß.

Sie sollten wahrscheinlich betrachten dies . Laut Dokumentation wird dieser Befehl vom Host-Betriebssystem aus ausgeführt (ich gehe von einem Ubuntu-Host und einem Windows-Gast aus):

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

Sollte regedit in Windows öffnen (der Gast), aber ich habe es nie geschafft, es zum Laufen zu bringen.

Sie können auch verwenden

VBoxManage showvminfo "Windows XP Pro" | grep State

um zu überprüfen, ob eine VM ausgeführt wird oder nicht.

Javier Rivera
quelle
Interessante Ideen, und ich denke, es könnte als ein anderer Weg verwendet werden, um die Aufgabe zu erfüllen. Der Gast kann vom Host aus gestartet werden. Wenn er ausgeführt wird, kann der Befehl möglicherweise ausgeführt werden, um einen Befehl auszuführen. Für einen Programmierer ist dies möglicherweise einfacher als meine Idee. Es muss "sleep" in einer Schleife verwendet werden, um zu warten, bis die VM hochgefahren ist. Dies kann jedoch vom Host aus mit einem einzigen Skript durchgeführt werden.
Marty Fried
Ich habe gerade Ihren ersten Ausführungsbefehl ausprobiert und konnte Quicken bei meinem ersten Versuch von einer bereits laufenden Windows XP-VM namens "Windows XP" mit diesem Befehl von einer Ubuntu-Terminalbefehlszeile ausführen:, VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXwobei XXXXX mein Benutzername und mein Kennwort war.
Marty Fried
Vielleicht ist mein Problem, dass ich ein passwortloses Konto verwende.
Javier Rivera
Wahrscheinlich ... Ich habe gerade den Befehl geändert, den ich ausgeführt habe, um Ihr Format zu verwenden, und es wurde tatsächlich regedit ausgeführt.
Marty Fried
Takkat hat gesagt, dass es in passwortlosen Konten wie meinem nicht funktioniert. Das erklärt, warum ich es nie geschafft hatte;).
Javier Rivera,
2

Ich habe die ursprüngliche Idee gelöscht, als mir klar wurde, dass sie nicht funktioniert, da Linux nicht auf die Windows-Partition in einer VM zugreifen kann, wenn sie noch nicht ausgeführt wird. Es mag eine komplexere Möglichkeit geben, aber ich weiß nicht, ob es sich wirklich lohnt.

Möglicherweise ist ein gemeinsames freigegebenes Verzeichnis möglich, und ein Skript in Windows überprüft dieses Verzeichnis immer, um festzustellen, ob es leer ist oder nicht. Andernfalls werden die Skripte im Verzeichnis ausgeführt, das vom Ubuntu-System vor dem Ausführen der VM dort abgelegt wird.

Sie könnten ein zweites Skript haben, das das erste löscht, damit es beim nächsten Mal nicht ausgeführt wird.

Marty Fried
quelle
Ich möchte eine Verknüpfung für Visual Studio und eine Verknüpfung für Internet Explorer erstellen, die vom Ubuntu-Desktop aus aufgerufen werden kann (damit sie auf der virtuellen Maschine ausgeführt werden). Kann dies mit der von Ihnen beschriebenen Methode durchgeführt werden?
Anderson Green
Ich möchte wissen, ob die Umkehrung auch durchgeführt werden kann - Starten einer Hostanwendung (wie Kolourpaint) vom Gastbetriebssystem aus.
Anderson Green
Könnte die Umkehrung dann unter Verwendung von Gastadditionen erfolgen?
Anderson Green
Beziehen Sie sich auch auf den Windows-Startordner oder die Liste der Ubuntu-Startanwendungen?
Anderson Green
Tut mir leid, ich habe festgestellt, dass meine erste Idee fehlerhaft war, da der Windows-Ordner erst vorhanden ist, wenn die VM ausgeführt wird. Ich habe meine Antwort komplett überarbeitet und hoffe, dass sie nicht zu verwirrend ist.
Marty Fried
1

Ich wollte dasselbe und löste es schließlich, ohne die Gästesteuerung zu verwenden. Auf meinem MacOS X-Host habe ich einen Ordner (mit dem Namen Windows), den mein vbox-Client, auf dem Win7 ausgeführt wird, als Z: zugeordnet hat. Ich benutze Dummy-Dateien, um wie folgt zwischen Host und meinen Clients zu kommunizieren:

Auf dem Mac-Host: - Für jede Windows-Anwendung, die ich im Win-Client starten wollte, wurde ein Shell-Skript mit einem Symbol erstellt. Sie stellen im Grunde genommen sicher, dass die VirtualBox noch nicht gestartet wurde, und erstellen dann eine "Start this particular application" -Datei in dem freigegebenen Ordner, die Windows nach dem Start lesen kann. Ein Beispiel für ein solches Skript ist:

#!/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

Dann habe ich auf dem Windows-Client ein passendes Skript (BAT-Datei) im Startup-Ordner, das so aussieht:

@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

Auf diese Weise kopiere ich jedes Mal, wenn ich ein neues Client-Startsymbol auf meinem Mac hinzufügen möchte, das Shell-Skript, erfinde eine neue Dummy-Datei und füge die entsprechenden Startzeilen im BAT-Skript auf dem Client hinzu. Funktioniert großartig und ich denke, es stimmt mit Martys Idee im vorherigen Beitrag überein.

Städtisch
quelle
Haben Sie dies in einem Ubuntu-Host getestet?
User68186
Nein, aber ich bin mir ziemlich sicher, dass es ohne Störungen funktionieren würde. Die vbox-Befehle sind identisch, ebenso wie bash.
Urban
Es ist sicherer zu benutzen pgrepals ps | grep. Letzteres läuft Gefahr, sich anzupassen.
muru
Ja, du hast Recht. Ich glaube, dass es oben mit ps behoben wurde, indem ein zusätzliches grep -v hinzugefügt wurde, um das Selbstanpassungsproblem herauszufiltern. Ich konnte nicht herausfinden, wie Sie pgrep in diesem Fall vorgeschlagen haben, da der VBox-Name 'Windows 7' in meinem Fall ein Kommentarargument für den Prozess ist, wie folgt: 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-errormsgboxAber haben Sie vielleicht einen Vorschlag dazu?
Urban