Khởi chạy một ứng dụng trong Windows từ máy tính để bàn Ubuntu


12

Tôi muốn viết một tập lệnh shell trong Ubuntu thực hiện như sau:

  1. Khởi động hệ điều hành khách Windows 7 trong Virtualbox, nếu nó chưa chạy.

  2. Chạy tập lệnh shell trong Windows, trong đó tập lệnh shell được gọi từ hệ điều hành máy chủ Ubuntu.

Mục tiêu của tôi là tạo ra một trình khởi chạy ứng dụng trên máy tính để bàn của máy chủ Ubuntu cho một ứng dụng trên hệ điều hành khách. Ví dụ: tôi có thể tạo một lối tắt cho Visual Studio trên máy tính để bàn Ubuntu khởi chạy Visual Studio trong Windows. Tôi luôn muốn có thể khởi chạy các ứng dụng Windows trực tiếp từ máy tính để bàn Ubuntu thay vì đợi Windows khởi động trước khi nhấp vào phím tắt ứng dụng.

Câu trả lời:


15

Có một số hạn chế từ khách Windows nhưng để chạy ứng dụng khách ở chế độ liền mạch từ tập lệnh có thể được đặt trong trình khởi chạy, chúng tôi đã thử nghiệm quy trình sau:

  • Khởi động Trình quản lý VirtualBox
  • Đăng nhập vào windows với người dùng và mật khẩu của bạn
  • Chuyển sang chế độ liền mạch Host+L
  • Ở chế độ liền mạch, lưu trạng thái của máy

Bây giờ chúng ta có thể kiểm soát dòng lệnh đầy đủ trên máy ảo bằng các lệnh sau:

  • Khởi động máy ảo từ trạng thái lưu liền mạch

    VBoxManage startvm "<Name_of_VM>"

    hoặc (đối với giao diện Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Chạy một ứng dụng trong VM

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Chấm dứt VM trong trạng thái lưu

    VBoxManage controlvm "Name_of_VM" savestate

Đặt chúng trong một tập lệnh để tận hưởng các cửa sổ ứng dụng Windows liền mạch trên màn hình Ubuntu của bạn.

Trong trường hợp bạn đã thiết lập đăng nhập Windows không mật khẩu, điều này sẽ không hoạt động. Xem trong Hướng dẫn sử dụng hộp ảo để biết các giới hạn và cách định cấu hình Windows để làm cho nó hoạt động.

Ngoài ra, để sử dụng các tài khoản không có hoặc có mật khẩu trống, chính sách nhóm khách phải được thay đổi. Để làm như vậy, hãy mở trình chỉnh sửa chính sách nhóm trên dòng lệnh bằng cách nhập gpedit.msc , mở khóa Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionsvà thay đổi giá trị Accounts: Limit local account use of blank passwords to console logon onlythành Vô hiệu hóa.

Trên các hệ điều hành không có Trình chỉnh sửa chính sách nhóm (gpedit.msc), chẳng hạn như phiên bản Home của Windows, tạo DWORD tại khóa đăng ký HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpasswordusevà đặt nó về 0 sẽ đạt được hiệu quả tương tự, theo câu trả lời này .


Mỗi lệnh này nên được chạy từ dòng lệnh Windows hay dòng lệnh Ubuntu?
Anderson Green

Khái niệm khá hay, mặc dù tôi chưa bao giờ thực sự thích chế độ liền mạch vì một số lý do - có lẽ vì nó gây nhầm lẫn về điều hướng bàn phím. Nhưng tôi muốn thử một số thứ này cho vài chương trình Windows mà tôi vẫn sử dụng, như Quicken và iTunes. @AndersonGreen: điều này được chạy từ dòng lệnh Ubuntu và có thể dễ dàng được nhập vào một thiết bị đầu cuối để thử nghiệm, sau đó được tạo thành một tập lệnh.
Marty Fried

Mật khẩu (được nhập trong tập lệnh) nên là mật khẩu đăng nhập Windows hay mật khẩu đăng nhập Ubuntu?
Anderson Green

Đó là mật khẩu windows bạn cần vì có khả năng bạn đã đăng nhập vào Ubuntu và bắt đầu VM không cần truy cập root. Lưu ý rằng bạn cần mật khẩu Windows và đăng nhập để nó hoạt động.
Takkat

Điều này có nên hoạt động theo cách đối diện (chạy Windows với tư cách là hệ điều hành chính và linux như máy ảo)
William

3

Đây là một gợi ý hơn là một câu trả lời, nhưng nó quá lớn cho một nhận xét.

Bạn có lẽ nên nhìn vào điều này . Theo các tài liệu, lệnh này, chạy từ hệ điều hành máy chủ (Tôi giả sử máy chủ Ubuntu và máy khách Windows):

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

Nên mở regedit trong Windows (khách), nhưng tôi chưa bao giờ có thể làm cho nó hoạt động.

Bạn cũng có thể dùng

VBoxManage showvminfo "Windows XP Pro" | grep State

để kiểm tra xem VM có chạy hay không.


Những ý tưởng thú vị, và tôi nghĩ nó có thể được sử dụng như một cách khác để hoàn thành nhiệm vụ. Khách có thể được khởi chạy từ máy chủ, sau đó khi nó chạy, lệnh có thể được thực hiện để hoạt động để chạy lệnh. Đối với một lập trình viên, nó có thể là một cách dễ dàng hơn ý tưởng của tôi; nó liên quan đến việc sử dụng "ngủ" trong một vòng lặp để chờ VM hoạt động, nhưng tất cả có thể được thực hiện từ máy chủ, với một tập lệnh duy nhất.
Marty Fried

Tôi vừa thử lệnh thực thi đầu tiên của bạn và có thể chạy Quicken trong lần thử đầu tiên của tôi từ một máy ảo Windows XP đang chạy, được đặt tên là "Windows XP" bằng cách sử dụng lệnh này từ một dòng lệnh của thiết bị đầu cuối Ubuntu: VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXtrong đó XXXXX là tên người dùng và mật khẩu của tôi.
Marty Fried

Có lẽ vấn đề của tôi là tôi sử dụng một tài khoản ít mật khẩu.
Javier Rivera

Có lẽ ... tôi vừa thay đổi lệnh tôi đã chạy để sử dụng định dạng của bạn và nó thực sự đã chạy regedit.
Marty Fried

Takkat đã nói rằng nó không hoạt động trong các tài khoản không có mật khẩu như của tôi. Điều đó giải thích tại sao tôi chưa bao giờ có thể làm điều đó;).
Javier Rivera

2

Tôi đã xóa ý tưởng ban đầu khi tôi nhận ra rằng nó sẽ không hoạt động vì Linux sẽ không thể truy cập vào phân vùng windows trong VM nếu nó chưa chạy. Có thể có một cách phức tạp hơn để làm điều đó, nhưng tôi không biết liệu nó có thực sự xứng đáng hay không.

Có thể có một thư mục dùng chung chung và một tập lệnh trong Windows sẽ luôn kiểm tra thư mục này để xem nó có trống hay không. Nếu không, nó sẽ chạy các tập lệnh trong thư mục, hệ thống Ubuntu sẽ được đặt ở đó trước khi chạy VM.

Bạn có thể có tập lệnh thứ 2 xóa tập lệnh thứ nhất để nó không chạy lần sau.


Tôi muốn tạo một lối tắt cho Visual Studio và một lối tắt cho Internet Explorer có thể được gọi từ máy tính để bàn Ubuntu (để chúng chạy trong máy ảo). Điều này có thể được thực hiện bằng phương pháp bạn mô tả?
Anderson Green

Tôi muốn biết liệu điều ngược lại cũng có thể được thực hiện hay không - khởi chạy một ứng dụng máy chủ (như Kolourpaint) từ hệ điều hành khách.
Anderson Green

Điều ngược lại có thể được thực hiện bằng cách sử dụng bổ sung của khách, sau đó?
Anderson Green

Ngoài ra, bạn đang đề cập đến thư mục khởi động Windows hoặc danh sách ứng dụng khởi động Ubuntu?
Anderson Green

Xin lỗi, tôi nhận ra ý tưởng đầu tiên của mình là thiếu sót, vì thư mục windows không tồn tại cho đến khi VM chạy. Tôi đã sửa đổi hoàn toàn câu trả lời của mình và tôi hy vọng nó không quá khó hiểu.
Marty Fried

1

Tôi muốn điều tương tự và cuối cùng đã giải quyết nó mà không cần sử dụng Guestcontrol. Trên máy chủ MacOS X của tôi, tôi có một thư mục (tên Windows) mà máy khách vbox của tôi đang chạy Win7 đã được ánh xạ là Z :. Tôi sử dụng các tập tin giả để liên lạc giữa máy chủ và khách hàng của mình như thế này:

Trên máy chủ Mac: - đã tạo một tập lệnh shell hoàn chỉnh với một biểu tượng cho mỗi ứng dụng windows mà tôi muốn bắt đầu trong Win-client. Về cơ bản, những gì họ làm là đảm bảo rằng VirtualBox chưa được khởi động trước đó và sau đó tạo một "khởi động ứng dụng cụ thể này" trong thư mục dùng chung mà Windows có thể đọc sau khi khởi động. Ví dụ về những gì một kịch bản như vậy là như thế này:

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

Sau đó, trên máy khách windows tôi có một tập lệnh phù hợp (tệp BAT) trong thư mục Khởi động giống như thế này:

@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

Bằng cách này, bất cứ khi nào tôi muốn thêm biểu tượng khởi động máy khách mới trên máy Mac của mình, tôi sao chép tập lệnh shell, phát minh tệp giả mới và thêm các dòng khởi động phù hợp trong tập lệnh BAT trên máy khách. Hoạt động tuyệt vời và tôi nghĩ rằng nó phù hợp với ý tưởng của Martys trong bài trước.


Bạn đã thử nghiệm điều này trong một máy chủ Ubuntu chưa?
dùng68186

Không, nhưng tôi khá chắc chắn rằng nó sẽ hoạt động mà không có trục trặc. Các lệnh vbox là như nhau và bash cũng vậy.
Đô thị

Nó an toàn hơn để sử dụng pgrepthay vì ps | grep. Cái sau có nguy cơ khớp chính nó.
muru

Vâng bạn đã đúng. Tôi tin rằng đã sửa nó ở trên bằng cách sử dụng ps bằng cách thêm một grep -v bổ sung để lọc vấn đề tự khớp. Tôi không thể tìm ra cách sử dụng pgrep như bạn đã đề xuất trong trường hợp này vì tên VBox 'Windows 7' trong trường hợp của tôi là một đối số nhận xét cho quy trình, như thế này: 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-errormsgboxnhưng có lẽ bạn có đề xuất về điều này?
Đô thị
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.