一、序言
Windows下的服務(wù)程序都遵循服務(wù)控制管理器(SCM)的接口標(biāo)準(zhǔn),
它們會(huì)在登錄系統(tǒng)時(shí)自動(dòng)運(yùn)行,甚至在沒有用戶登錄系統(tǒng)的情況下也會(huì)正常執(zhí)行,類似與UNIX系統(tǒng)中的守護(hù)進(jìn)程(daemon)。它們大多是控制臺(tái)程序,不
過也有少數(shù)的GUI程序。本文所涉及到的服務(wù)程序僅限于Windows2000/XP系統(tǒng)中的一般服務(wù)程序,不包含Windows9X。
二、Windows服務(wù)簡(jiǎn)介
服務(wù)控制管理器擁有一個(gè)在注冊(cè)表中記錄的數(shù)據(jù)庫,包含了所有已安裝的服務(wù)程序和設(shè)備驅(qū)動(dòng)服務(wù)程序的相關(guān)信息。它允許系統(tǒng)管理員為每個(gè)服務(wù)自定義安全要求
和控制訪問權(quán)限。Windows服務(wù)包括四大部分:服務(wù)控制管理器(Service Control Manager),服務(wù)控制程序
(Service Control Program),服務(wù)程序(Service Program)和服務(wù)配置程序
(Service Configuration Program)。
1.服務(wù)控制管理器(SCM)
服務(wù)控制管理器在系統(tǒng)啟動(dòng)的早期由Winlogon進(jìn)程啟動(dòng),可執(zhí)行文件名是“Admin$\System32\Services.exe”,它是系統(tǒng)中的一個(gè)RPC服務(wù)器,因此服務(wù)配置程序和服務(wù)控制程序可以在遠(yuǎn)程操縱服務(wù)。它包括以下幾方面的信息:
已安裝服務(wù)數(shù)據(jù)庫:服務(wù)控制管理器在注冊(cè)表中擁有一個(gè)已安裝服務(wù)的數(shù)據(jù)庫,它在服務(wù)控制管理器和程序添加,刪除,配置服務(wù)程序時(shí)使用,在注冊(cè)表中數(shù)據(jù)庫
的位置為:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services。它包括很多子鍵,每個(gè)子鍵的名
字就代表一個(gè)對(duì)應(yīng)的服務(wù)。數(shù)據(jù)庫中包括:服務(wù)類型(私有進(jìn)程,共享進(jìn)程),啟動(dòng)類型(自動(dòng)運(yùn)行,由服務(wù)控制管理器啟動(dòng),無效),錯(cuò)誤類型(忽略,常規(guī)錯(cuò)
誤,服務(wù)錯(cuò)誤,關(guān)鍵錯(cuò)誤),執(zhí)行文件路徑,依賴信息選項(xiàng),可選用戶名與密碼。
自動(dòng)啟動(dòng)服務(wù):系統(tǒng)啟動(dòng)時(shí),服務(wù)控制管理器啟動(dòng)所有“自啟”服務(wù)和相關(guān)依賴服務(wù)。服務(wù)的加載順序:順序裝載組列表:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder;指定組列表:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GroupOrderList;每個(gè)服務(wù)所依賴的服務(wù)程序。
在系統(tǒng)成功引導(dǎo)后會(huì)保留一份LKG(Last-Know-Good)的配置信息位于:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services。
因要求而啟動(dòng)服務(wù):用戶可以使用服務(wù)控制面板程序來啟動(dòng)一項(xiàng)服務(wù)。服務(wù)控制程序也可以使用StartService來啟動(dòng)服務(wù)。服務(wù)控制管理器會(huì)進(jìn)行下面的操作:獲取帳戶信息,登錄服務(wù)項(xiàng)目,創(chuàng)建服務(wù)為懸掛狀態(tài),分配登錄令牌給進(jìn)程,允許進(jìn)程執(zhí)行。
服務(wù)記錄列表:每項(xiàng)服務(wù)在數(shù)據(jù)庫中都包含了下面的內(nèi)容:服務(wù)名稱,開始類型,服務(wù)狀態(tài)(類型,當(dāng)前狀態(tài),接受控制代碼,退出代碼,等待提示),依賴服務(wù)列表指針。
服務(wù)控制管理器句柄:服務(wù)控制管理器支持句柄類型訪問以下對(duì)象:已安裝服務(wù)數(shù)據(jù)庫,服務(wù)程序,數(shù)據(jù)庫的鎖開狀態(tài)。
2.服務(wù)控制程序(SCP)
服務(wù)控制程序可以執(zhí)行對(duì)服務(wù)程序的開啟,控制和狀態(tài)查詢功能:
開啟服務(wù):如果服務(wù)的開啟類型為SERVICE_DEMAND_START,就可以用服務(wù)控制程序來開始一項(xiàng)服務(wù)。在開始服務(wù)的初始化階段服務(wù)的當(dāng)前狀
態(tài)為:SERVICE_START_PENDING,而在初始化完成后的狀態(tài)就是:SERVICE_RUNNING。
向正在運(yùn)行的
服務(wù)發(fā)送控制請(qǐng)求:控制請(qǐng)求可以是系統(tǒng)默認(rèn)的,也可以是用戶自定義的。標(biāo)準(zhǔn)控制代碼如下:停止服務(wù)(SERVICE_CONTROL_STOP),暫停服
務(wù)(SERVICE_CONTROL_PAUSE),恢復(fù)已暫停服務(wù)(SERVICE_CONTROL_CONTINUE),獲得更新信息
(SERVICE_CONTROL_INTERROGATE)。
3.服務(wù)程序
一個(gè)服務(wù)程序可能擁有一個(gè)或多
個(gè)服務(wù)的執(zhí)行代碼。我們可以創(chuàng)建類型為SERVICE_WIN32_OWN_PROCESS的只擁有一個(gè)服務(wù)的服務(wù)程序。而類型為
SERVICE_WIN32_SHARE_PROCESS的服務(wù)程序卻可以包含多個(gè)服務(wù)的執(zhí)行代碼。詳情參見后面的Windows服務(wù)與編程。
4.服務(wù)配置程序
編程人員和系統(tǒng)管理員可以使用服務(wù)配置程序來更改,查詢已安裝服務(wù)的信息。當(dāng)然也可以通過注冊(cè)表函數(shù)來訪問相關(guān)資源。
服務(wù)的安裝,刪除和列舉:我們可以使用相關(guān)的系統(tǒng)函數(shù)來創(chuàng)建,刪除服務(wù)和查詢所有服務(wù)的當(dāng)前狀態(tài)。
服務(wù)配置:系統(tǒng)管理員通過服務(wù)配置程序來控制服務(wù)的啟動(dòng)類型,顯示名稱和相關(guān)描述信息。