Lancer une application dans Windows à partir du bureau Ubuntu

12

J'aimerais écrire un script shell dans Ubuntu qui fait ce qui suit:

  1. Démarrez un système d'exploitation invité Windows 7 dans Virtualbox, s'il ne fonctionne pas déjà.

  2. Exécutez un script shell dans Windows, où le script shell est appelé à partir du système d'exploitation hôte Ubuntu.

Mon objectif est de créer un lanceur d'application sur le bureau hôte Ubuntu pour une application sur le système d'exploitation invité. Par exemple, je pourrais créer un raccourci pour Visual Studio sur le bureau Ubuntu qui lance Visual Studio dans Windows. J'ai toujours voulu pouvoir lancer des applications Windows directement depuis le bureau Ubuntu au lieu d'attendre le démarrage de Windows avant de cliquer sur un raccourci d'application.

Anderson Green
la source

Réponses:

15

Il y a quelques limitations des invités Windows, mais pour exécuter une application invitée en mode transparent à partir d'un script qui peut être placé dans un lanceur, nous avons testé la procédure suivante:

  • Démarrez VirtualBox Manager
  • Connectez-vous à Windows avec votre utilisateur et votre mot de passe
  • Passer en mode transparent Host+L
  • En mode transparent, enregistrez l'état de la machine

Maintenant, nous pouvons obtenir un contrôle complet en ligne de commande sur la machine virtuelle avec les commandes suivantes:

  • Démarrez la machine virtuelle à partir d'un état d'enregistrement transparent

    VBoxManage startvm "<Name_of_VM>"

    ou (pour le frontend Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Exécutez une application dans la machine virtuelle

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Mettre fin à la VM en état de sauvegarde

    VBoxManage controlvm "Name_of_VM" savestate

Mettez-les dans un script pour profiter de fenêtres d'applications Windows transparentes sur votre bureau Ubuntu.

Si vous avez configuré une connexion Windows sans mot de passe, cela ne fonctionnera pas. Voir dans le Manuel de la Boîte Virtuelle pour les limitations et comment configurer Windows pour le faire fonctionner.

De plus, pour utiliser des comptes sans ou avec un mot de passe vide, la stratégie de groupe de l'invité doit être modifiée. Pour ce faire, ouvrez l'éditeur de stratégie de groupe sur la ligne de commande en tapant gpedit.msc , ouvrez la clé Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionset modifiez la valeur de Accounts: Limit local account use of blank passwords to console logon onlysur Désactivé.

Sur les systèmes d'exploitation sans l'Éditeur de stratégie de groupe (gpedit.msc), tels que les éditions personnelles de Windows, la création d'un DWORD à la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduseet sa définition à zéro auront le même effet, selon cette réponse .

Takkat
la source
Est-ce que chacune de ces commandes doit être exécutée à partir de la ligne de commande Windows ou de la ligne de commande Ubuntu?
Anderson Green
Concept assez sympa, même si je n'ai jamais vraiment aimé le mode transparent pour une raison quelconque - probablement parce qu'il devient déroutant pour la navigation au clavier. Mais je suis tenté d'essayer une partie de cela pour mes quelques programmes Windows que j'utilise toujours, comme Quicken et iTunes. @AndersonGreen: ceci est exécuté à partir de la ligne de commande Ubuntu, et peut facilement être entré dans un terminal pour le test, puis transformé en script.
Marty Fried
Le mot de passe (saisi dans le script) doit-il être le mot de passe de connexion Windows ou le mot de passe de connexion Ubuntu?
Anderson Green
C'est le mot de passe Windows dont vous avez besoin car vous êtes probablement connecté à Ubuntu, et le démarrage d'une machine virtuelle ne devrait pas nécessiter un accès root. Notez que vous avez besoin d' un mot de passe Windows et connectez-vous pour que cela fonctionne.
Takkat
Cela devrait-il fonctionner dans le manoir opposé (exécutant Windows comme système d'exploitation principal et Linux comme machine virtuelle)
William
3

C'est plus un indice qu'une réponse, mais c'est trop gros pour un commentaire.

Vous devriez probablement regarder cela . Selon les documents, cette commande, exécutée à partir du système d'exploitation hôte (je suppose un hôte Ubuntu et un invité Windows):

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

Devrait ouvrir regedit dans Windows (l'invité), mais je n'ai jamais pu le faire fonctionner.

Vous pouvez aussi utiliser

VBoxManage showvminfo "Windows XP Pro" | grep State

pour vérifier si une VM est en cours d'exécution ou non.

Javier Rivera
la source
Des idées intéressantes, et je pense que cela pourrait être utilisé comme une autre façon d'accomplir la tâche. L'invité pourrait être lancé à partir de l'hôte, puis lorsqu'il est en cours d'exécution, la commande pourrait probablement être exécutée pour exécuter une commande. Pour un programmeur, cela peut être un moyen plus simple que mon idée; cela implique d'utiliser "sleep" dans une boucle pour attendre que la machine virtuelle soit en place, mais cela peut être fait à partir de l'hôte, avec un seul script.
Marty Fried
Je viens d'essayer votre première commande d'exécution et j'ai pu exécuter Quicken lors de ma première tentative à partir d'une machine virtuelle Windows XP déjà en cours d'exécution, nommée "Windows XP" en utilisant cette commande à partir d'une ligne de commande de terminal Ubuntu:, VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXoù XXXXX était mon nom d'utilisateur et mon mot de passe.
Marty Fried
Peut-être que mon problème est que j'utilise un compte sans mot de passe.
Javier Rivera
Probablement ... Je viens de changer la commande que j'ai exécutée pour utiliser votre format et il a effectivement exécuté regedit.
Marty Fried
Takkat a déclaré que cela ne fonctionne pas dans les comptes sans mot de passe comme le mien. Cela explique pourquoi je n'ai jamais pu le faire;).
Javier Rivera
2

J'ai supprimé l'idée d'origine lorsque j'ai réalisé que cela ne fonctionnerait pas car Linux ne pourrait pas accéder à la partition Windows dans une machine virtuelle si elle ne fonctionne pas déjà. Il peut y avoir une façon plus complexe de le faire, mais je ne sais pas si cela en vaut vraiment la peine.

Il peut être possible d'avoir un répertoire partagé commun, et un script sous Windows vérifierait toujours ce répertoire pour voir s'il est vide ou non. Sinon, il exécuterait les scripts dans le répertoire, qui y seraient mis par le système Ubuntu avant d'exécuter la machine virtuelle.

Vous pourriez avoir un 2e script qui supprime le 1er afin qu'il ne s'exécute pas la prochaine fois.

Marty Fried
la source
Je voudrais créer un raccourci pour Visual Studio et un raccourci pour Internet Explorer qui peuvent être invoqués à partir du bureau Ubuntu (afin qu'ils s'exécutent dans la machine virtuelle). Cela peut-il être fait en utilisant la méthode que vous avez décrite?
Anderson Green
Je voudrais savoir si l'inverse pourrait également être fait - lancer une application hôte (telle que Kolourpaint) à partir du système d'exploitation invité.
Anderson Green
L'inverse pourrait-il être fait en utilisant des ajouts d'invités, alors?
Anderson Green
Parlez-vous également du dossier de démarrage de Windows ou de la liste des applications de démarrage d'Ubuntu?
Anderson Green
Désolé, j'ai réalisé que ma première idée était erronée, car le dossier Windows n'existe pas tant que la machine virtuelle n'est pas en cours d'exécution. J'ai révisé ma réponse complètement et j'espère que ce n'est pas trop déroutant.
Marty Fried
1

Je voulais la même chose et j'ai fini par la résoudre sans utiliser guestcontrol. Sur mon hôte MacOS X, j'ai un dossier (nommé Windows) que mon client vbox exécutant un Win7 a mappé en tant que Z :. J'utilise des fichiers factices pour communiquer entre l'hôte et mes clients comme ceci:

Sur l'hôte Mac: - créé un script shell complet avec une icône pour chaque application Windows que je voulais démarrer dans Win-client. Ce qu'ils font, c'est de s'assurer que la VirtualBox n'a pas été démarrée avant, puis crée un fichier "démarrer cette application particulière" dans le dossier partagé que Windows peut lire après le démarrage. Voici à quoi ressemble un tel script:

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

Ensuite, sur le client Windows, j'ai un script correspondant (fichier BAT) dans le dossier de démarrage qui ressemble à ceci:

@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

De cette façon, chaque fois que je veux ajouter une nouvelle icône de démarrage client sur mon Mac, je copie le script shell, invente un nouveau fichier factice et ajoute les lignes de démarrage correspondantes dans le script BAT sur le client. Fonctionne très bien et je pense que cela correspond à l'idée de Martys dans le post précédent.

Urbain
la source
Avez-vous testé cela sur un hôte Ubuntu?
user68186
Non, mais je suis sûr que cela fonctionnerait sans problèmes. Les commandes vbox sont les mêmes, tout comme bash.
Urban
Il est plus sûr d'utiliser pgrepau lieu de ps | grep. Ce dernier risque de s'accorder.
muru
Oui tu as raison. Je pense que cela a été résolu ci-dessus en utilisant ps en ajoutant un grep -v supplémentaire pour filtrer le problème d'auto-correspondance. Je ne pouvais pas comprendre comment utiliser pgrep comme vous l'avez suggéré dans ce cas car le nom de la VBox 'Windows 7' dans mon cas est un argument de commentaire pour le processus, comme ceci: 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-errormsgboxmais peut-être avez-vous une suggestion à ce sujet?
Urban