Je voudrais écrire un script Shell dans Ubuntu qui fait ce qui suit:
Démarrez un système d'exploitation invité Windows 7 dans Virtualbox, s'il ne fonctionne pas déjà.
Exécutez un script Shell dans Windows, où le script Shell est appelé à partir du système d'exploitation de l'hôte Ubuntu.
Mon objectif 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.
Il existe certaines limitations des invités Windows, 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:
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 de l'état de sauvegarde transparente .
VBoxManage startvm "<Name_of_VM>"
ou (pour l'interface Qt)
VirtualBox --startvm "<Name_of_VM>"
Exécuter 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
Termine VM à l'é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 Virtual Box 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 , ouvrez la clé
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
et modifiez la valeur deAccounts: Limit local account use of blank passwords to console logon only
en Désactivé.
Sur les systèmes d'exploitation dépourvus de l'éditeur de stratégie de groupe (gpedit.msc), tels que les éditions personnelles de Windows, créer un DWORD sur la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduse
et le mettre à zéro aura le même effet, conformément à cette réponse =.
C'est plus un indice qu'une réponse, mais c'est trop gros pour un commentaire.
Vous devriez probablement regarder this . Selon la documentation, cette commande est exécutée à partir du système d'exploitation hôte (dans l'hypothèse d'un hôte Ubuntu et d'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 un VM est en cours d'exécution ou non.
J'ai supprimé l'idée initiale lorsque j'ai réalisé que cela ne fonctionnerait pas car Linux ne pourra pas accéder à la partition Windows dans une VM si elle n'est pas déjà en cours d'exécution. 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 serait 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 qu’ils s’assurent que la VirtualBox n’a pas été démarrée auparavant et crée ensuite 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 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 du post précédent.