srvany.exe是什么?
srvany.exe是Microsoft Windows Resource Kits工具集的一個實用的小工具,用於將任何EXE程序作為Windows服務運行。也就是說srvany只是其注冊程序的服務外殼,這個特性對於我們來說非常實用,我們可以通過它讓我們的程序以SYSTEM賬戶啟動,或者實現隨機器啟動而自啟動,也可以隱藏不必要的窗口,比如說控制台窗口等等。
如何獲取?
你可以通過下載並安裝Microsoft Windows Resource Kits獲得或者可以通過我分享的下載地址1(國內線路)、下載地址2(國外線路)得到。
如何使用?
當你獲取到srvany后並決定將某程序作為服務啟動后,請先將srvany安裝為系統服務,具體的安裝方法有很多,比如說可以通過Microsoft Windows Resource Kits中另外一個實用的小工具instsrv.exe進行安裝(下載地址),將srvany.exe和instsrv.exe拷貝到C:\Windows\System32\后,我們可以通過下面的命令行進行srvany.exe的服務安裝:
instsrv ServiceName C:\Windows\System32\srvany.exe
ServiceName即你自己定義的服務名稱,可以是要作為系統服務啟動的應用程序的名稱。
安裝完畢后,我們需要對srvany.exe進行配置,以便於能夠加載我們指定的程序,配置的方法是,開始 – 運行 – regedit,打開注冊表,定位到下面的路徑。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName
同樣的ServiceName是你剛才安裝服務時自定義的服務名稱。
如果該服務名下沒有Parameters項目,則對服務名稱項目右擊新建項,名稱為Parameters,然后定位到Parameters項,新建以下幾個字符串值。
名稱 Application 值為你要作為服務運行的程序地址。
名稱 AppDirectory 值為你要作為服務運行的程序所在文件夾路徑。
名稱 AppParameters 值為你要作為服務運行的程序啟動所需要的參數。
比如這里是個配置實例,我們這里配置的服務名稱是NGINX,其余是nginx的安裝配置情況。
當然還有一個比較簡單的做法,那就是將下面的文本保存為*.reg文件,然后雙擊導入注冊表。
1 2 3 4 5 6 |
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服務名稱\Parameters] "Application"="值為你要作為服務運行的程序地址" "AppDirectory"="值為你要作為服務運行的程序所在文件夾路徑" "AppParameters"="值為你要作為服務運行的程序啟動所需要的參數" |
2011年7月14日更新
找到微軟的官方文章《如何創建用戶定義的服務》,大家可以看一看。
2012年2月27日更新
今天有朋友問到將某窗體程序通過srvany作為服務運行的時候,桌面右下角圖標和窗體無法顯示,這個就涉及到服務的運行方式了,一般服務程序是不包含窗體的,所以系統默認可能會抑制這些服務程序產生的窗體,如果你的服務程序比較特殊,確實需要出現窗體,可以參考下面的辦法:
控制面板 – 管理工具 – 服務(或者 開始 – 運行 – services.msc 確認)打開服務管理器,選擇你剛剛安裝並需要展示窗體的服務,然后右擊選擇屬性,切換到 “登錄” 選項卡,勾選上 “允許服務與桌面交互” 然后按確定保存,重啟你的服務,看看窗體是否出現了:
2012年7月3日更新
為了大家利用srvany.exe創建自定義服務的方便我特別寫了個名叫SrvanyUI的服務創建管理的小工具,大家可以移步這篇文章《SrvanyUI服務管理工具發布》來獲得詳細信息,這里放個截圖:
2012年7月5日更新
找到微軟的一篇文章可以參考《故障排除使用 Cmd.exe 的 SrvAny》。
2012年7月23日更新
近期有朋友咨詢為什么勾選上 “允許服務與桌面交互”,窗體程序依舊不能顯示,其實這個辦法只適用於Windows XP或者Windows 2003系列的操作系統,對於以上版本的Windows Vista、Windows 2008、Windows 7以及Windows 2008 R2,微軟做了改變,使用了Session 0會話隔離策略,所以再使用這個辦法強制服務窗體顯示就會出現提示框,只有手動允許后才會出現界面,並且桌面風格也將被更改:
交互式服務檢測
此計算機上運行的程序正在嘗試顯示一條消息
程序可能需要您的信息或權限來完成任務。
關於Vista及高版本Windows交互出現提示框是由Interactive Services Detection服務控制的。禁用此服務將不會出現上述提示框,當然窗體也就不會顯示了。
更詳細的信息可以參考MSDN的《Interactive Services》文章。
特別注意下面這段:
Important Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code.
如果要在新的Vista及以上操作系統上顯示窗體,我們應當使用新的技術,比如使用WTSSendMessage在用戶會話顯示對話框,或者將服務程序與窗體分離開來再使用進程通信(推薦)。
關於編程的方法可以參考這篇文章《解決vista和win7在windows服務中交互桌面權限問題:穿透Session 0 隔離》
抱歉的是目前的辦法僅限於編程方面的,其他有效的辦法我暫時還沒有找到。
部分參考文檔:
- 《What is Interactive Services Detection and Why is it Blinking at Me?》
- 《How can a Windows service execute a GUI application?》
2012年2月27日更新
對於帶參數的命令行方式直接利用srvany.exe創建自定義服務請參考文章《WScript/VBScript命令行參數使用srvany.exe創建自定義服務》。
END
轉自:http://wangye.org/blog/archives/42/