Inicie una aplicación en Windows desde el escritorio de Ubuntu

12

Me gustaría escribir un script de shell en Ubuntu que haga lo siguiente:

  1. Inicie un sistema operativo invitado Windows 7 en Virtualbox, si aún no se está ejecutando.

  2. Ejecute un script de shell en Windows, donde el script de shell se invoca desde el sistema operativo host de Ubuntu.

Mi objetivo es crear un iniciador de aplicaciones en el escritorio del host de Ubuntu para una aplicación en el sistema operativo invitado. Por ejemplo, podría crear un acceso directo para Visual Studio en el escritorio de Ubuntu que inicie Visual Studio en Windows. Siempre quise poder iniciar aplicaciones de Windows directamente desde el escritorio de Ubuntu en lugar de esperar a que Windows se inicie antes de hacer clic en el acceso directo de una aplicación.

Anderson Green
fuente

Respuestas:

15

Los invitados de Windows tienen algunas limitaciones, pero para ejecutar una aplicación de invitado en modo integrado desde un script que se puede poner en un lanzador, probamos el siguiente procedimiento:

  • Inicie VirtualBox Manager
  • Inicie sesión en Windows con su usuario y contraseña
  • Cambiar a modo continuo Host+L
  • En modo continuo, guarde el estado de la máquina

Ahora podemos obtener un control total de la línea de comandos sobre la máquina virtual con los siguientes comandos:

  • Inicie la máquina virtual desde el estado de guardado sin interrupciones

    VBoxManage startvm "<Name_of_VM>"

    o (para la interfaz Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Ejecute una aplicación en la VM

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Terminar VM en estado de guardar

    VBoxManage controlvm "Name_of_VM" savestate

Póngalos en una secuencia de comandos para disfrutar de ventanas de aplicaciones de Windows integradas en su escritorio Ubuntu.

En caso de que haya configurado un inicio de sesión de Windows sin contraseña, esto no funcionará. Consulte el Manual de Virtual Box para conocer las limitaciones y cómo configurar Windows para que funcione.

Además, para usar cuentas sin o con una contraseña vacía, se debe cambiar la política de grupo del invitado. Para hacerlo, abra el editor de políticas de grupo en la línea de comando escribiendo gpedit.msc , abra la clave Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionsy cambie el valor de Accounts: Limit local account use of blank passwords to console logon onlya Disabled.

En los sistemas operativos sin el Editor de directivas de grupo (gpedit.msc), como las ediciones Home de Windows, crear una DWORD en la clave de registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpasswordusey establecerla en cero logrará el mismo efecto, según esta respuesta .

Takkat
fuente
¿Deben ejecutarse cada uno de estos comandos desde la línea de comandos de Windows o la línea de comandos de Ubuntu?
Anderson Green
Muy buen concepto, aunque nunca me ha gustado el modo integrado por alguna razón, probablemente porque se vuelve confuso sobre la navegación del teclado. Pero estoy tentado a probar algo de esto para mis pocos programas de Windows que todavía uso, como Quicken e iTunes. @AndersonGreen: esto se ejecuta desde la línea de comandos de Ubuntu, y se puede ingresar fácilmente en una terminal para probar, y luego convertirlo en un script.
Marty Fried
¿La contraseña (que se ingresa en el script) debe ser la contraseña de inicio de sesión de Windows o la contraseña de inicio de sesión de Ubuntu?
Anderson Green
Es la contraseña de Windows lo que necesita, ya que es probable que haya iniciado sesión en Ubuntu, y el inicio de una VM no debería requerir acceso de root. Tenga en cuenta que necesita una contraseña de Windows e inicie sesión para que esto funcione.
Takkat
Si esto funciona en la mansión opuesta (ejecutando Windows como sistema operativo principal y Linux como máquina virtual)
William
3

Esto es más una pista que una respuesta, pero es demasiado grande para un comentario.

Probablemente deberías mirar esto . Según los documentos, este comando se ejecuta desde el sistema operativo host (supongo que un host Ubuntu y un invitado Windows):

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

Debería abrir regedit en Windows (el invitado), pero nunca he podido hacerlo funcionar.

También puedes usar

VBoxManage showvminfo "Windows XP Pro" | grep State

para verificar si una VM se está ejecutando o no.

Javier Rivera
fuente
Ideas interesantes, y creo que podría usarse como otra forma de realizar la tarea. El invitado podría iniciarse desde el host, luego, cuando se está ejecutando, el comando probablemente podría funcionar para ejecutar un comando. Para un programador, puede ser una forma más fácil que mi idea; implica usar "dormir" en un bucle para esperar a que la VM esté activa, pero todo se puede hacer desde el host, con un solo script.
Marty Fried
Acabo de probar su primer comando de ejecución y pude ejecutar Quicken en mi primer intento desde una máquina virtual con Windows XP, llamada "Windows XP", usando este comando desde una línea de comandos de la terminal de Ubuntu: VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXdonde XXXXX era mi nombre de usuario y contraseña.
Marty Fried
Quizás mi problema es que uso una cuenta sin contraseña.
Javier Rivera
Probablemente ... acabo de cambiar el comando que ejecuté para usar su formato y de hecho ejecutó regedit.
Marty Fried
Takkat ha dicho que no funciona en cuentas sin contraseña como la mía. Eso explica por qué nunca había podido hacerlo;).
Javier Rivera
2

Eliminé la idea original cuando me di cuenta de que no funcionaría porque Linux no podrá acceder a la partición de Windows en una VM si aún no se está ejecutando. Puede haber una forma más compleja de hacerlo, pero no sé si realmente vale la pena.

Es posible tener un directorio compartido común, y un script en Windows siempre verificará este directorio para ver si está vacío o no. De lo contrario, ejecutaría los scripts en el directorio, que el sistema Ubuntu colocaría allí antes de ejecutar la VM.

Podría tener un segundo script que elimine el primero para que no se ejecute la próxima vez.

Marty Fried
fuente
Me gustaría crear un acceso directo para Visual Studio y un acceso directo para Internet Explorer que se pueda invocar desde el escritorio de Ubuntu (para que se ejecuten en la máquina virtual). ¿Se puede hacer esto usando el método que describiste?
Anderson Green
Me gustaría saber si también se podría hacer lo inverso: iniciar una aplicación host (como Kolourpaint) desde el sistema operativo invitado.
Anderson Green
¿Podría hacerse lo inverso usando adiciones de invitados, entonces?
Anderson Green
Además, ¿se refiere a la carpeta de inicio de Windows o la lista de aplicaciones de inicio de Ubuntu?
Anderson Green
Lo siento, me di cuenta de que mi primera idea era defectuosa, porque la carpeta de Windows no existe hasta que se ejecuta la VM. Revisé mi respuesta por completo, y espero que no sea demasiado confusa.
Marty Fried
1

Quería lo mismo y terminé resolviéndolo sin usar guestcontrol. En mi host MacOS X tengo una carpeta (llamada Windows) que mi cliente vbox que ejecuta un Win7 ha asignado como Z :. Utilizo archivos ficticios para comunicarme entre el host y mis clientes de esta manera:

En el host de Mac: creé un script de shell completo con un icono para cada aplicación de Windows que quería iniciar en el cliente Win. Lo que básicamente hacen es asegurarse de que VirtualBox no se haya iniciado antes y luego crea un archivo "iniciar esta aplicación en particular" en la carpeta compartida que Windows puede leer después del inicio. Ejemplo de cómo se ve este 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

Luego, en el cliente de Windows, tengo un script coincidente (archivo BAT) en la carpeta de inicio que se ve así:

@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 esta manera, cada vez que quiero agregar un nuevo icono de inicio de cliente en mi Mac, copio el script de shell, invento un nuevo archivo ficticio y agrego las líneas de inicio coincidentes en el script BAT en el cliente. Funciona muy bien y creo que está en línea con la idea de Martys en la publicación anterior.

Urbano
fuente
¿Has probado esto en un host de Ubuntu?
user68186
No, pero estoy bastante seguro de que funcionaría sin problemas técnicos. Los comandos de vbox son los mismos y también lo es bash.
Urbano
Es más seguro de usar en pgreplugar de ps | grep. Este último corre el riesgo de igualarse.
muru
Sí tienes razón. Creo que lo solucioné arriba usando ps agregando un grep -v adicional para filtrar el problema de autocomposición. No pude entender cómo usar pgrep como sugirió en este caso, ya que el nombre de VBox 'Windows 7' en mi caso es un argumento de comentario para el proceso, como este: 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-errormsgboxpero ¿tal vez tiene una sugerencia sobre esto?
Urbano