UbuntuデスクトップからWindowsでアプリケーションを起動する


12

Ubuntuで次のことを行うシェルスクリプトを作成したいと思います。

  1. VirtualboxでWindows 7ゲストOSを起動します(まだ実行されていない場合)。

  2. Windowsでシェルスクリプトを実行します。シェルスクリプトは、Ubuntuホストオペレーティングシステムから呼び出されます。

私の目標は、ゲストOS上のアプリケーション用にUbuntuホストデスクトップ上にアプリケーションランチャーを作成することです。たとえば、WindowsでVisual Studioを起動するUbuntuデスクトップにVisual Studioのショートカットを作成できます。Windowsが起動するのを待ってからアプリケーションのショートカットをクリックするのではなく、UbuntuデスクトップからWindowsアプリケーションを直接起動できるようにしたいと常に思っていました。

回答:


15

Windowsゲストにはいくつかの制限がありますが、ランチャーに配置できるスクリプトからゲストアプリケーションをシームレスモードで実行するには、次の手順をテストしました。

  • VirtualBox Managerを起動します
  • ユーザーとパスワードを使用してWindowsにログインします
  • シームレスモードに切り替えHost+L
  • シームレスモードでは、マシンの状態を保存します

これで、次のコマンドを使用して、仮想マシンに対する完全なコマンドライン制御を取得できます。

  • シームレスな保存状態から仮想マシンを起動します

    VBoxManage startvm "<Name_of_VM>"

    または(Qtフロントエンドの場合)

    VirtualBox --startvm "<Name_of_VM>"
  • VMでアプリケーションを実行する

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • 保存状態のVMを終了する

    VBoxManage controlvm "Name_of_VM" savestate

これらをスクリプトに入れて、UbuntuデスクトップでシームレスなWindowsアプリケーションウィンドウをお楽しみください。

パスワードなしのWindowsログオンを設定した場合、これは機能しません。制限と、それを機能させるためにWindowsを構成する方法については、Virtual Boxのマニュアルを参照してください。

また、空のパスワードの有無にかかわらずアカウントを使用するには、ゲストのグループポリシーを変更する必要があります。そのためには、コマンドラインでgpedit.mscと入力してグループポリシーエディターを開き、キーComputer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionsを開いて値Accounts: Limit local account use of blank passwords to console logon onlyを[無効]に変更します。

WindowsのHomeエディションなど、グループポリシーエディター(gpedit.msc)のないオペレーティングシステムでは、レジストリキーでDWORDを作成し、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduseゼロに設定すると、同じ回答が得られます。


これらの各コマンドは、WindowsコマンドラインまたはUbuntuコマンドラインから実行する必要がありますか?
アンダーソングリーン

かなりいいコンセプトですが、なんらかの理由でシームレスモードがあまり好きではありませんでした-おそらくキーボードナビゲーションが混乱するためです。しかし、QuickenやiTunesなど、今でも使用しているいくつかのWindowsプログラムでこの機能を試してみたいと思います。@AndersonGreen:これは、Ubuntuコマンドラインから実行され、テスト用のターミナルに簡単に入力して、スクリプトにすることができます。
マーティフライド

(スクリプトに入力される)パスワードは、Windowsログインパスワードですか、Ubuntuログインパスワードですか?
アンダーソングリーン

Ubuntuにログインしている可能性が高いために必要なWindowsパスワードであり、VMの起動にはルートアクセスは必要ありません。これを機能させるには、Windowsパスワードとログインが必要なことに注意してください。
Takkat

これが反対のマナーで動作するか(WindowsをメインOSとして、Linuxを仮想マシンとして実行)
William

3

これは答えよりもヒントですが、コメントするには大きすぎます。

あなたはおそらく見なければならない、この。ドキュメントによると、このコマンドはホストOSから実行します(UbuntuホストとWindowsゲストを想定しています)。

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

Windows(ゲスト)でregeditを開く必要がありますが、私はそれを機能させることができませんでした。

使用することもできます

VBoxManage showvminfo "Windows XP Pro" | grep State

VMが実行中かどうかを確認します。


興味深いアイデアです。タスクを達成する別の方法として使用できると思います。ゲストをホストから起動し、実行中にコマンドを実行してコマンドを実行できる可能性があります。プログラマーにとっては、私の考えよりも簡単な方法かもしれません。VMが起動するのを待つためにループで「スリープ」を使用する必要がありますが、すべて1つのスクリプトでホストから実行できます。
マーティフライド

最初の実行コマンドを試したところ、Ubuntuターミナルコマンドラインから次のコマンドを使用して、「Windows XP」という名前の既に実行中のWindows XP VMから最初の試行でQuickenを実行できました: VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXXXXXXは私のユーザー名とパスワードです。
マーティフライド

たぶん私の問題は、パスワードなしのアカウントを使用していることです。
ハビエルリベラ

おそらく...私は実行したコマンドをあなたのフォーマットを使用するように変更しただけで、実際にregeditを実行しました。
マーティフライド

Takkatは、私のようなパスワードのないアカウントでは動作しないと言っています。それが私がそれをできなかった理由を説明しています;)。
ハビエルリベラ

2

まだ実行されていない場合、LinuxはVMのWindowsパーティションにアクセスできないため、機能しないことがわかったときに元のアイデアを削除しました。もっと複雑な方法があるかもしれませんが、本当に価値があるかどうかはわかりません。

共通の共有ディレクトリを使用することは現実的であり、Windowsのスクリプトは常にこのディレクトリをチェックして、空かどうかを確認します。そうでない場合は、ディレクトリ内のスクリプトを実行し、VMを実行する前にUbuntuシステムによってそこに配置されます。

次回実行されないように、1番目のスクリプトを削除する2番目のスクリプトを作成することもできます。


Ubuntuデスクトップから起動できるVisual StudioのショートカットとInternet Explorerのショートカットを作成したい(仮想マシンで実行されるように)。これは、説明した方法を使用して実行できますか?
アンダーソングリーン

ゲストOSからホストアプリケーション(Kolourpaintなど)を起動して、逆も実行できるかどうかを知りたいです。
アンダーソングリーン

それでは、ゲストの追加を使用して逆を実行できますか?
アンダーソングリーン

また、WindowsスタートアップフォルダまたはUbuntuスタートアップアプリケーションリストを参照していますか?
アンダーソングリーン

申し訳ありませんが、VMが実行されるまでwindowsフォルダーは存在しないため、最初のアイデアに欠陥があることに気付きました。私は答えを完全に修正しましたが、それがあまりにも混乱しないことを願っています。
マーティフライド

1

同じことを望み、guestcontrolを使用せずに解決しました。MacOS Xホストには、Win7を実行しているvboxクライアントがZ:としてマップしたフォルダー(Windowsという名前)があります。次のように、ダミーファイルを使用してホストとクライアント間で通信します。

Macホストで:-Winクライアントで起動したい各Windowsアプリケーションのアイコンを備えた1つのシェルスクリプトを作成しました。彼らが基本的に行うことは、VirtualBoxが以前に起動されていないことを確認し、起動後にWindowsが読み取れる共有フォルダに「この特定のアプリケーションを起動」ファイルを作成することです。そのようなスクリプトがどのように見えるかの例はこれです:

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

次に、Windowsクライアントでは、Startup-folderに次のような一致するスクリプト(BATファイル)があります。

@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

この方法で、Macに新しいクライアント起動アイコンを追加するたびに、シェルスクリプトをコピーし、新しいダミーファイルを作成して、クライアントのBATスクリプトに一致する起動行を追加します。うまく機能し、前の投稿のMartysのアイデアに沿っていると思います。


Ubuntuホストでこれをテストしましたか?
user68186 14年

いいえ、しかし、私はそれがグリッチなしでうまくいくと確信しています。vboxコマンドは同じであり、bashも同じです。
アーバン14年

pgrep代わりに使用する方が安全ですps | grep。後者はそれ自体が一致するリスクがあります。
ムル14年

はい、あなたが正しい。余分なgrep -vを追加して自己一致の問題を取り除くことにより、psを使用して上記の問題を修正したと思います。私の場合のVBox名「Windows 7」はプロセスのコメント引数であるため、この場合に提案したようにpgrepを使用する方法を理解できませんでした 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-errormsgboxが、おそらくこれについて提案がありますか?
アーバン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.