Luncurkan aplikasi di Windows dari desktop Ubuntu

12

Saya ingin menulis skrip shell di Ubuntu yang melakukan hal berikut:

  1. Boot OS tamu Windows 7 di Virtualbox, jika belum berjalan.

  2. Jalankan skrip shell di Windows, di mana skrip shell dipanggil dari sistem operasi host Ubuntu.

Tujuan saya adalah membuat peluncur aplikasi pada desktop host Ubuntu untuk aplikasi pada OS tamu. Sebagai contoh, saya bisa membuat pintasan untuk Visual Studio di desktop Ubuntu yang meluncurkan Visual Studio di Windows. Saya selalu ingin dapat meluncurkan aplikasi Windows langsung dari desktop Ubuntu alih-alih menunggu Windows untuk memulai sebelum mengklik pintasan aplikasi.

Anderson Green
sumber

Jawaban:

15

Ada beberapa batasan dari para tamu Windows tetapi untuk menjalankan aplikasi tamu dalam mode mulus dari skrip yang dapat dimasukkan ke dalam peluncur, kami menguji prosedur berikut:

  • Mulai VirtualBox Manager
  • Masuk ke windows dengan pengguna dan kata sandi Anda
  • Beralih ke mode mulus Host+L
  • Dalam mode mulus, simpan status mesin

Sekarang kita bisa mendapatkan kontrol baris perintah penuh atas mesin virtual dengan perintah berikut:

  • Mulai mesin virtual dari keadaan save yang mulus

    VBoxManage startvm "<Name_of_VM>"

    atau (untuk frontend Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Jalankan aplikasi di VM

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Hentikan VM dalam kondisi save

    VBoxManage controlvm "Name_of_VM" savestate

Masukkan ini dalam skrip untuk menikmati jendela aplikasi Windows yang mulus di desktop Ubuntu Anda.

Jika Anda telah membuat logon Windows tanpa kata sandi, ini tidak akan berfungsi. Lihat di Manual Kotak Virtual untuk batasan dan cara mengkonfigurasi Windows agar berfungsi.

Juga, untuk menggunakan akun tanpa atau dengan kata sandi kosong, kebijakan grup tamu harus diubah. Untuk melakukannya, buka editor kebijakan grup di baris perintah dengan mengetikkan gpedit.msc , buka kunci Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionsdan ubah nilai Accounts: Limit local account use of blank passwords to console logon onlymenjadi Dinonaktifkan.

Pada sistem operasi tanpa Group Policy Editor (gpedit.msc), seperti edisi Home Windows, membuat DWORD pada kunci registri HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpasswordusedan mengaturnya ke nol akan mencapai efek yang sama, menurut jawaban ini .

Takkat
sumber
Haruskah masing-masing perintah ini dijalankan dari baris perintah Windows atau baris perintah Ubuntu?
Anderson Green
Konsep yang cukup bagus, walaupun saya tidak pernah benar-benar menyukai mode tanpa batas untuk beberapa alasan - mungkin karena itu membingungkan tentang navigasi keyboard. Tetapi saya tergoda untuk mencoba beberapa dari ini untuk beberapa program Windows yang masih saya gunakan, seperti Quicken dan iTunes. @AndersonGreen: ini dijalankan dari commandline Ubuntu, dan dapat dengan mudah dimasukkan dalam terminal untuk pengujian, kemudian dibuat menjadi skrip.
Marty Fried
Haruskah kata sandi (dimasukkan dalam skrip) menjadi kata sandi masuk Windows, atau kata sandi masuk Ubuntu?
Anderson Green
Ini adalah kata sandi windows yang Anda butuhkan karena Anda kemungkinan masuk ke Ubuntu, dan memulai VM seharusnya tidak memerlukan akses root. Perhatikan bahwa Anda memerlukan kata sandi Windows dan login untuk bisa berfungsi.
Takkat
Haruskah ini bekerja di manor yang berlawanan (menjalankan Windows sebagai OS utama dan linux sebagai mesin virtual)
William
3

Ini lebih merupakan petunjuk daripada jawaban, tetapi terlalu besar untuk dikomentari.

Anda mungkin harus melihat ini . Menurut dokumen, perintah ini, dijalankan dari OS host (Saya menganggap host Ubuntu dan tamu Windows):

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

Harus membuka regedit di Windows (tamu), tetapi saya tidak pernah bisa membuatnya berfungsi.

Anda juga bisa menggunakan

VBoxManage showvminfo "Windows XP Pro" | grep State

untuk memeriksa apakah VM sedang berjalan atau tidak.

Javier Rivera
sumber
Ide yang menarik, dan saya pikir itu bisa digunakan sebagai cara lain untuk menyelesaikan tugas. Tamu dapat diluncurkan dari tuan rumah, lalu ketika sedang berjalan, perintah mungkin bisa dibuat bekerja untuk menjalankan perintah. Untuk seorang programmer, ini mungkin cara yang lebih mudah daripada ide saya; itu melibatkan menggunakan "tidur" dalam satu lingkaran untuk menunggu VM naik, tetapi semuanya dapat dilakukan dari tuan rumah, dengan satu skrip.
Marty Fried
Saya baru saja mencoba perintah eksekusi pertama Anda dan dapat menjalankan Quicken pada upaya pertama saya dari VM Windows XP yang sudah berjalan, bernama "Windows XP" menggunakan perintah ini dari commandline terminal Ubuntu:, di VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXmana XXXXX adalah nama pengguna dan kata sandi saya.
Marty Fried
Mungkin masalah saya adalah saya kurang menggunakan kata sandi akun.
Javier Rivera
Mungkin ... Saya baru saja mengubah perintah saya berlari untuk menggunakan format Anda dan itu memang menjalankan regedit.
Marty Fried
Takkat mengatakan bahwa itu tidak berfungsi di akun tanpa kata sandi seperti milik saya. Itu menjelaskan mengapa saya tidak pernah bisa melakukannya;).
Javier Rivera
2

Saya menghapus ide asli ketika saya menyadari bahwa itu tidak akan berhasil karena Linux tidak akan dapat mengakses partisi windows di VM jika itu belum berjalan. Mungkin ada cara yang lebih kompleks untuk melakukannya, tetapi saya tidak tahu apakah itu benar-benar layak.

Mungkin layak untuk memiliki direktori bersama yang umum, dan skrip di Windows akan selalu memeriksa direktori ini untuk melihat apakah direktori itu kosong atau tidak. Jika tidak, itu akan menjalankan skrip di direktori, yang akan diletakkan di sana oleh sistem Ubuntu sebelum menjalankan VM.

Anda dapat memiliki skrip ke-2 yang menghapus skrip ke-1 sehingga tidak berjalan di waktu berikutnya.

Marty Fried
sumber
Saya ingin membuat pintasan untuk Visual Studio dan pintasan untuk Internet Explorer yang dapat dipanggil dari desktop Ubuntu (sehingga mereka berjalan di mesin virtual). Bisakah ini dilakukan dengan menggunakan metode yang Anda gambarkan?
Anderson Green
Saya ingin tahu apakah kebalikannya juga dapat dilakukan - meluncurkan aplikasi host (seperti Kolourpaint) dari sistem operasi tamu.
Anderson Green
Mungkinkah kebalikannya dilakukan menggunakan penambahan tamu?
Anderson Green
Juga, apakah Anda merujuk ke folder startup Windows atau daftar aplikasi startup Ubuntu?
Anderson Green
Maaf, saya menyadari ide pertama saya cacat, karena folder windows tidak ada sampai VM berjalan. Saya merevisi jawaban saya sepenuhnya, dan saya harap itu tidak terlalu membingungkan.
Marty Fried
1

Saya menginginkan hal yang sama dan akhirnya menyelesaikannya tanpa menggunakan guestcontrol. Pada host MacOS X saya, saya memiliki folder (bernama Windows) yang dijalankan oleh klien vbox saya yang menjalankan Win7 sebagai Z :. Saya menggunakan file dummy untuk berkomunikasi antara host dan klien saya seperti ini:

Pada host Mac: - membuat satu skrip shell lengkap dengan ikon untuk setiap aplikasi windows yang ingin saya mulai di Win-client. Apa yang pada dasarnya mereka lakukan adalah memastikan bahwa VirtualBox belum pernah dimulai sebelumnya dan kemudian membuat "mulai aplikasi khusus ini" -file di folder bersama yang dapat dibaca oleh Windows setelah startup. Contoh skrip tersebut adalah:

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

Kemudian pada klien windows saya memiliki skrip yang cocok (BAT-file) di folder Startup yang terlihat seperti ini:

@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

Dengan cara ini, setiap kali saya ingin menambahkan ikon startup klien baru di Mac saya, saya menyalin skrip shell, menciptakan file dummy baru dan menambahkan baris startup yang cocok di skrip BAT pada klien. Bekerja hebat dan saya pikir itu sejalan dengan ide Martys di posting sebelumnya.

Urban
sumber
Sudahkah Anda menguji ini di host Ubuntu?
user68186
Tidak, tapi saya cukup yakin itu akan berhasil tanpa gangguan. Perintah vbox sama dan begitu juga bash.
Urban
Lebih aman untuk digunakan pgrepdaripada ps | grep. Yang terakhir menanggung risiko pencocokan itu sendiri.
muru
Ya kau benar. Saya percaya memperbaikinya di atas menggunakan ps dengan menambahkan grep -v ekstra untuk menyaring masalah pertandingan-sendiri. Saya tidak tahu cara menggunakan pgrep seperti yang Anda sarankan dalam kasus ini karena nama VBox 'Windows 7' dalam kasus saya adalah argumen komentar untuk proses, seperti ini: 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-errormsgboxtapi mungkin Anda punya saran tentang ini?
Urban