Lança um aplicativo no Windows a partir do desktop do Ubuntu

10

Eu gostaria de escrever um script de shell no Ubuntu que faça o seguinte:

  1. Inicialize um sistema operacional convidado do Windows 7 no Virtualbox, caso ainda não esteja em execução.

  2. Execute um script de shell no Windows, onde o script de shell é invocado a partir do sistema operacional do host Ubuntu.

Meu objetivo é criar um lançador de aplicativos no desktop do host Ubuntu para um aplicativo no sistema operacional convidado. Por exemplo, eu poderia criar um atalho para o Visual Studio no desktop do Ubuntu que inicia o Visual Studio no Windows. Eu sempre quis poder iniciar aplicativos do Windows diretamente do desktop do Ubuntu, em vez de esperar que o Windows inicializasse antes de clicar em um atalho do aplicativo.

    
por Anderson Green 21.06.2012 / 02:05

4 respostas

11

Existem algumas limitações dos convidados do Windows, mas para executar um aplicativo convidado no modo transparente a partir de um script que pode ser colocado em um inicializador, testamos o seguinte procedimento:

  • Iniciar gerenciador de caixas virtuais
  • Faça login no Windows com seu usuário e senha
  • Alternar para o modo contínuo Host + L
  • No modo contínuo, salve o estado da máquina

Agora podemos obter o controle total da linha de comando sobre a máquina virtual com os seguintes comandos:

  • Inicie a máquina virtual a partir do estado de gravação contínuo

    VBoxManage startvm "<Name_of_VM>"
    

    ou (para o frontend do Qt)

    VirtualBox --startvm "<Name_of_VM>"
    
  • Executa uma aplicação na VM

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\full\path\to\program.exe" --username windowsuser --password password --wait-stdout
    
  • Encerra a VM no estado de salvamento

    VBoxManage controlvm "Name_of_VM" savestate
    

Coloque-os em um script para aproveitar as janelas de aplicativos do Windows no seu desktop Ubuntu.

Caso você tenha configurado um logon do Windows sem senha, isso não funcionará. Veja no Manual do Virtual Box as limitações e como configurar o Windows para que funcione.

"Além disso, para usar contas sem ou com uma senha vazia, a política de grupo do convidado deve ser alterada. Para fazer isso, abra o editor de política de grupo na linha de comando digitando gpedit.msc, abra a chave Configuração do Computador \ Windows Configurações \ Configurações de Segurança \ Políticas Locais \ Opções de Segurança e altere o valor de Contas: Limite o uso de senhas em branco da conta local para o logon do console apenas para Desativado. "

    
por Takkat 21.06.2012 / 18:41
3

Isso é mais uma dica do que uma resposta, mas é grande demais para um comentário.

Provavelmente você deve analisar este . De acordo com os documentos, este comando, executado a partir do sistema operacional host (estou assumindo um host Ubuntu e convidado Windows):

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

Deve abrir o regedit no Windows (o convidado), mas nunca consegui fazê-lo funcionar.

Você também pode usar

VBoxManage showvminfo "Windows XP Pro" | grep State

para verificar se uma VM está sendo executada ou não.

    
por Javier Rivera 21.06.2012 / 15:51
2

Eu apaguei a ideia original quando percebi que não funcionaria porque o Linux não conseguirá acessar a partição do Windows em uma VM se ela ainda não estiver em execução. Pode haver uma maneira mais complexa de fazer isso, mas não sei se vale a pena.

Pode ser possível ter um diretório compartilhado comum e um script no Windows sempre verificará esse diretório para ver se ele está vazio ou não. Caso contrário, ele executaria os scripts no diretório, que seriam colocados pelo sistema Ubuntu antes de executar a VM.

Você pode ter um segundo script que exclua o primeiro para que ele não seja executado da próxima vez.

    
por Marty Fried 21.06.2012 / 02:20
1

Eu queria a mesma coisa e acabei resolvendo sem usar o controle de guest. No meu host MacOS X eu tenho uma pasta (chamada Windows) que meu cliente vbox executando um Win7 mapeou como Z :. Eu uso arquivos fictícios para se comunicar entre o host e meus clientes assim:

No host do Mac: - criei um script de shell completo com um ícone para cada aplicativo do Windows que eu queria iniciar no Win-client. O que eles basicamente fazem é garantir que o VirtualBox não tenha sido iniciado antes e, em seguida, crie um arquivo "start this particular application" na pasta compartilhada que o Windows pode ler após a inicialização. Exemplo de como tal script é assim:

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

Em seguida, no cliente windows, tenho um script correspondente (arquivo BAT) na pasta Startup que se parece com isso:

@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

Dessa forma, sempre que eu quiser adicionar um novo ícone de inicialização do cliente em meu Mac, copio o script de shell, invento um novo arquivo fictício e adiciono as linhas de inicialização correspondentes no script BAT no cliente. Funciona muito bem e acho que está de acordo com a ideia de Martys no post anterior.

    
por Urban 04.11.2014 / 19:41