為何要自動啟動VMWare
為什麼開機後要自動啟動VMWare呢?! 當然是要啟動VMWare裏的伺服器, 比如在VMWare裏安裝了Ubuntu系統, 然後架設了ftp server及Apache web server. 當外殼Windows啟動後, 也要順便啟動Ubuntu. 此時就有此需求了
現在問題來了, 當Windows 7啟動後, 一定要先登入, VMWare才有可能自動啟動. 如果希望Windows7在未登入任何使用者時, 就啟動VMWare, 依目前網路上大家的說明, 幾乎都是廢文, 完全不可能.
此篇文章就是為了破除網路上的廢文, 讓VMWare可以在未登入前, 就在背景啟動服務
網路常見的錯誤說明
網路常介紹的, 不外乎如下
1. 寫個bat檔, 然後放在shell:startup裏面
這有二個問題, 一個是此法必需登入才會執行, 另一個問題是為什麼要寫腳本呢, 直接把vmware.exe 或vmplayer.exe的捷徑放在shell:startup裏就好了啊, 這樣啟動時也不會出現一個很礙眼的DOS視窗‧
2. 執行 gpedit.msc, 然後進入Windows設定/指令碼, 於啟動/關機二個項目裏執行指令碼. 此法是完全沒用的, 不用再試了, 試了也是白試。(此法好像需先用其他指令允許啟動本機群組原則,懶的試了)
3.開始/附屬應用程式/系統工具/工作排程器, 在裏面新增一個工作, 觸發時機選電腦啟動時執行. 此方法可行,不過記得要勾選 “不論使用者登入與否均執行”,如此不需要登入亦會自動執行。 不過關機前若要先結束VMWare呢? 又是無解.
正確解決方式
那到底要如何解決呢!! 唯一的方法, 就是自己寫 Windows 服務程式, 本人是使用C# 撰寫的. 不知什麼是 Windows服務的話, 請參照本人所撰寫的文章 — 背景服務Windows Service
請注意, 上述程式碼一定要執行外部程式 vmrun.exe. 因為只有vmrun才能控制VMWare的啟動及停止.
OnStart中, 執行參數是 “-T ws start 映像檔名 nogui”, 記得要加 nogui, 這樣才能無聲無息的在背景中偷偷的運作, 也只有nogui才能正常執行
OnStop中, 執行參數是 “stop 映像檔 soft”, 記得要加 soft, 才能把VMWare正常關機
在C#中, 程式碼撰寫如下
public partial class 啟動Ubuntu : ServiceBase { public 啟動Ubuntu() { InitializeComponent(); } protected override void OnStart(string[] args) { Process.Start(@"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe", @"-T ws start C:\vmware\ubuntu16045\Ubuntu16045.vmx nogui"); } protected override void OnStop() { Process.Start(@"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe", @"stop C:\vmware\ubuntu16045\Ubuntu16045.vmx soft"); } }
安裝Windows服務
上述建置程式後, 在dos下輸入 installUtil 程式名.exe, 即可安裝此服務, 可於如下圖看到VMSrv開始於背景執行
若要移除安裝, 請使用 installUtil /u 程式名.exe
操作方式
重新開機後, 就會在背景啟動VMWare, 如下圖所示, vmware-vmx.exe即為正在執行的程式碼‧
若要停止VMWare, 在dos下使用 stop xxx soft是沒有用的. 需於服務的VMSrv按右鍵/停止服務 才可以‧
請注意, 連 vmrun list, 也是無法列出目前正在執行的VMWare列表
完整程式碼如下 : VMService.rar
工作排程
在 “開始/Windows 系統管理工具/工作排程” 也可以指定開機時就執行 vmware.exe,但卻沒有關機時要執行的選項,所以關機時 vmware 的 lock 檔沒被刪除,導致在下次重新開機時,無法啟重 vmware,因此工作排程是行不通的。
工作排程跟系統服務是完全不一樣的東西,且工作排程其實有很多的 bug,建議還是不要常用工作排程。