將應用程序註冊成後臺服務程序

將任何應用程序註冊成後臺服務程序,即:系統啓動後該程序可以自動啓動,並且在前臺不要出現運行窗口。
解決辦法:需要使用Windows提供的兩個工具instsrv.exe和srvany.exe。(Windows 2003資源工具包帶有)
  • instsrv:把win32程序變成系統服務。
  • srvany:將一個應用程序註冊爲一個服務。即註冊一個系統服務,來啓動要運行的應用程序。
基本用法:
  • instsrv  [服務名]  [應用程序絕對路徑]  (增加服務)
  • instsrv  [服務名]  REMOVE  (刪除服務)
  • instsrv  [服務名]  [srvany的絕對路徑]
一、應用程序具有服務功能(能響應服務控制檯的查詢請求)
使用instsrv.exe,指令格式:instsrv [服務名] [應用程序路徑]
執行完成後,在註冊表項“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。
具體步驟如下:
  1. 註冊服務:  path\instsrv  [服務名]  path\srvany.exe (同樣第一種情況,把[應用程序路徑]換爲[srvany路徑]。)
  2. 運行regedit打開註冊表,進入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[服務名]
  3. 新建一個項,項名爲Parameters,在項Parameters下新建如下建值:
  4. 右鍵-新建-字符串值Application,值數據填入[應用程序絕對路徑],如:D:\RuijieSupport\MentoHUST\MentoHUST.exe
  5. 右鍵-新建-字符串值AppDirectory,值數據填入[應用程序工作目錄],如:  D:\RuijieSupport\MentoHUST\
  6. 運行services.msc打開服務管理,找到剛添加的服務,在屬性-登錄中,勾選“允許服務與桌面交互”。
  7. 啓動服務。
說明:
  1. 執行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”
  2. 在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。
遇到不具有服務功能的應用程序,還是要打開註冊表,接着上述操作,在創建的服務項下新建項Parameters,並添加鍵值。
說明:
  1. ServiceType 服務類型:0×10爲獨立進程服務,0×20爲共享進程服務(比如svchost);
  2. StartType 啓動類型:0 系統引導時加載,1 OS初始化時加載,2 由SCM(服務控制管理器)自動啓動,3 手動啓動,4 禁用。(注意,0和1只能用於驅動程序)
  3. ErrorControl 錯誤控制:0 忽略,1 繼續並警告,2 切換到LastKnownGood的設置,3 藍屏。
  4. ServiceBinary 服務程序位置:%11%表示system32目錄,%10%表示系統目錄(WINNT或Windows),%12%爲驅動目錄system32\drivers。也可以不用變量,直接使用全路徑。
  5. 服務名MentoHUST後面有兩個逗號,因爲中間省略了一個不常用的參數flags。
  6. Description、ServiceType、StartType、ErrorControl四項是必須要有的,還有LoadOrderGroup、Dependencies等就不做詳述了。
使用inf文件的優勢:
  1. 和用SC等工具一樣,inf文件的效果是即時起效的,而導入reg後必須重啓纔有效。
  2. 導出一個系統自帶服務的註冊表項,如果數據類型是REG_EXPAND_SZ,會看到一堆16進制代碼,可讀性很差。手動導入註冊表以增加服務時,這樣定義ImagePath顯然很不方便,而用REG_SZ代替又會有些問題,比如不能用環境變量。用inf文件完全沒有這個問題,ServiceBinary(即ImagePath)自動成爲REG_EXPAND_SZ。
  3. inf文件會自動爲服務的註冊表項添加一個Security子鍵,使它看起來更像系統自帶的服務。
  4. AddService和DelService以及AddReg、DelReg可以同時且重複使用。即可以同時增加和刪除多個服務和註冊表項。
四、通過修改註冊表來添加服務: 
在註冊表編輯器,展開分支"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services" ,在右側窗格中顯示的就是本機安裝的服務項。如果要新建服務,只須點擊"編輯→新建→項" ,然後爲此項命名,如"test";然後右擊該項,選擇"新建→字符串值"或"新建→Dword值"即可。添加一個服務項目具體需要添加的鍵值如下: 
"DisplayName",字符串值,對應服務名稱; 
"Description",字符串值,對應服務描述; 
"ImagePath",字符串值,對應該服務程序所在的路徑;
"ObjectName",字符串值,值爲"LocalSystem",表示本地登錄;
"ErrorControl",Dword值,值爲"1"; 
"Start",Dword值,值爲2表示自動運行,值爲3表示手動運行,值爲4表示禁止; 
"Type",Dword值,應用程序對應10,其它對應20。 
  另外,還要在"test"項下新建一個"Enum"項。如果有些必須通過srvany來加載的還必須添加另外的Parameters子項在該項中提供詳細的要加爲服務的程序所在的路徑。而上面的那個路徑就需要指到srvany所在的路徑。 
 
附:Windows 2003資源工具包 下載地址
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章