將任何應用程序註冊成後臺服務程序,即:系統啓動後該程序可以自動啓動,並且在前臺不要出現運行窗口。
解決辦法:需要使用Windows提供的兩個工具instsrv.exe和srvany.exe。(Windows 2003資源工具包帶有)
- instsrv:把win32程序變成系統服務。
- srvany:將一個應用程序註冊爲一個服務。即註冊一個系統服務,來啓動要運行的應用程序。
基本用法:
- instsrv [服務名] [應用程序絕對路徑] (增加服務)
- instsrv [服務名] REMOVE (刪除服務)
- instsrv [服務名] [srvany的絕對路徑]
一、應用程序具有服務功能(能響應服務控制檯的查詢請求)
使用instsrv.exe,指令格式:instsrv [服務名] [應用程序路徑]
執行完成後,在註冊表項“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\”中自動增加項[服務名],並在其下成功添加各個鍵值:
執行完成後,在註冊表項“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\”中自動增加項[服務名],並在其下成功添加各個鍵值:
“DisplayName” =服務顯示名 (字符串值)
“Description” =服務描述 (字符串值)
“ImagePath” =應用程序路徑 (可擴充字符串值)
“ObjectName” =”LocalSystem” (字符串值)
“Type” =10(16進制) (dword值)
“Start” =2(16進制) (dword值)
“ErrorControl” =1(16進制) (dword值)
如果不使用instsrv.exe,同樣可以在註冊表中手工添加實現:在“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\”下新建一個項,項名爲要顯示的服務名,並在其下新建以上各個鍵,填入鍵值。
這樣,一個服務就增加成功了,運行services.msc在服務管理器中可以看到,重啓電腦就會自動啓動服務。
二、應用程序不具有服務功能(不能響應服務控制檯的查詢請求)
並不是所有程序都適合做系統服務,即便註冊成系統服務後也是無法啓動,這時就需要用到srvany.exe。
具體步驟如下:
- 註冊服務: path\instsrv [服務名] path\srvany.exe (同樣第一種情況,把[應用程序路徑]換爲[srvany路徑]。)
- 運行regedit打開註冊表,進入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[服務名]
- 新建一個項,項名爲Parameters,在項Parameters下新建如下建值:
- 右鍵-新建-字符串值Application,值數據填入[應用程序絕對路徑],如:D:\RuijieSupport\MentoHUST\MentoHUST.exe
- 右鍵-新建-字符串值AppDirectory,值數據填入[應用程序工作目錄],如: D:\RuijieSupport\MentoHUST\
- 運行services.msc打開服務管理,找到剛添加的服務,在屬性-登錄中,勾選“允許服務與桌面交互”。
- 啓動服務。
說明:
- 執行instsrv命令如果出現出錯提示:- The fully qualified path to the .EXE must be given。則說明需要寫完整的路徑,並最好用引號包含。如:C:\Program Files\Windows Resource Kits\Tools> instsrv MentoHUST “C:\Program Files\Windows Resource Kits\Tools\srvany.exe”
- 在Parameters裏還可以添加很多鍵值:
AppDirectory 工作目錄
AppParameters 你的應用程序的參數。
AppEnvironment 運行環境變量。
三、以上方法同樣可以採用inf文件實現。
inf文件格式:
增加一個服務:
[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall.Services]
AddService=MentoHUST,,My_AddService_Name
[My_AddService_Name]
DisplayName=MentoHUST Replace Ruijie
Description=銳捷替代
ServiceType=0×10
StartType=2
ErrorControl=0
ServiceBinary=%11%\MentoHUST.exe
刪除一個服務:
[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall.Services]
DelService=MentoHUST
增加服務的inf文件創建後,保存,並執行命令:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 path\inf文件名
執行完成後,同樣會看到:在註冊表中看到新增的服務項MentoHUST和鍵值,在服務管理器會看到新增的服務MentoHUST。
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 path\inf文件名
執行完成後,同樣會看到:在註冊表中看到新增的服務項MentoHUST和鍵值,在服務管理器會看到新增的服務MentoHUST。
遇到不具有服務功能的應用程序,還是要打開註冊表,接着上述操作,在創建的服務項下新建項Parameters,並添加鍵值。
說明:
- ServiceType 服務類型:0×10爲獨立進程服務,0×20爲共享進程服務(比如svchost);
- StartType 啓動類型:0 系統引導時加載,1 OS初始化時加載,2 由SCM(服務控制管理器)自動啓動,3 手動啓動,4 禁用。(注意,0和1只能用於驅動程序)
- ErrorControl 錯誤控制:0 忽略,1 繼續並警告,2 切換到LastKnownGood的設置,3 藍屏。
- ServiceBinary 服務程序位置:%11%表示system32目錄,%10%表示系統目錄(WINNT或Windows),%12%爲驅動目錄system32\drivers。也可以不用變量,直接使用全路徑。
- 服務名MentoHUST後面有兩個逗號,因爲中間省略了一個不常用的參數flags。
- Description、ServiceType、StartType、ErrorControl四項是必須要有的,還有LoadOrderGroup、Dependencies等就不做詳述了。
使用inf文件的優勢:
- 和用SC等工具一樣,inf文件的效果是即時起效的,而導入reg後必須重啓纔有效。
- 導出一個系統自帶服務的註冊表項,如果數據類型是REG_EXPAND_SZ,會看到一堆16進制代碼,可讀性很差。手動導入註冊表以增加服務時,這樣定義ImagePath顯然很不方便,而用REG_SZ代替又會有些問題,比如不能用環境變量。用inf文件完全沒有這個問題,ServiceBinary(即ImagePath)自動成爲REG_EXPAND_SZ。
- inf文件會自動爲服務的註冊表項添加一個Security子鍵,使它看起來更像系統自帶的服務。
- AddService和DelService以及AddReg、DelReg可以同時且重複使用。即可以同時增加和刪除多個服務和註冊表項。
四、通過修改註冊表來添加服務:
"DisplayName",字符串值,對應服務名稱;
"Description",字符串值,對應服務描述;
"ImagePath",字符串值,對應該服務程序所在的路徑;
"ObjectName",字符串值,值爲"LocalSystem",表示本地登錄;
"ErrorControl",Dword值,值爲"1";
"Start",Dword值,值爲2表示自動運行,值爲3表示手動運行,值爲4表示禁止;
"Type",Dword值,應用程序對應10,其它對應20。
附:Windows 2003資源工具包 下載地址
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en