Lancer une application sous Windows à partir du bureau Ubuntu

Je voudrais écrire un script shell dans Ubuntu qui fait ce qui suit:

  1. Démarrez un OS 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 objective est de créer un lanceur d’application sur le bureau de l’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 sous Windows. J’ai toujours voulu pouvoir lancer des applications Windows directement à partir du bureau Ubuntu au lieu d’attendre le démarrage de Windows avant de cliquer sur un raccourci d’application.

Les invités Windows ont quelques limitations, mais pour exécuter une application invité en mode transparent à partir d’un script pouvant être inséré dans un programme de lancement, nous avons testé la procédure suivante:

  • Démarrer le gestionnaire de boîtes virtuelles
  • Connectez-vous à Windows avec votre utilisateur et votre mot de passe
  • Basculer 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émarrer la machine virtuelle à partir de l’état de sauvegarde transparent

    VBoxManage startvm "" 

    ou (pour l’interface Qt)

     VirtualBox --startvm "" 
  • Exécuter une application dans la VM

     VBoxManage --nologo guestcontrol "" 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. Consultez le Manuel de la boîte virtuelle pour connaître 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, puis ouvrez la clé Configuration ordinateur \ Paramètres Windows \ Sécurité. Paramètres \ Stratégies locales \ Options de sécurité et modifiez la valeur de Comptes: limitez l’utilisation des mots de passe vierges aux comptes locaux pour vous connecter à la console uniquement à Désactivé. ”

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

Vous devriez probablement regarder ça . Selon la documentation, cette commande est exécutée à partir du système d’exploitation hôte (en supposant qu’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 réussi à le faire fonctionner.

Vous pouvez aussi utiliser

 VBoxManage showvminfo "Windows XP Pro" | grep State 

pour vérifier si une machine virtuelle est en cours d’exécution ou non.

J’ai supprimé l’idée initiale lorsque j’ai compris que cela ne fonctionnerait pas car Linux ne pourra pas accéder à la partition Windows d’une machine virtuelle si elle ne fonctionne pas déjà. Il y a peut-être une façon plus complexe de le faire, mais je ne sais pas si cela en vaut vraiment la peine.

Il peut être envisageable 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 du répertoire, qui y seraient mis par le système Ubuntu avant d’exécuter la VM.

Vous pourriez avoir un deuxième script qui supprime le premier afin qu’il ne s’exécute pas la prochaine fois.

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 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éation d’un script shell complet avec une icône pour chaque application Windows que je voulais démarrer dans le client Win. Ce qu’ils font en réalité, c’est s’assurer que la VirtualBox n’a pas été démarrée auparavant, 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 un exemple de script de ce type:

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

Ainsi, chaque fois que je veux append une nouvelle icône de démarrage du 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 du post précédent.