【W(wǎng)indows】 Vista服務(wù)詳解_第1頁
【W(wǎng)indows】 Vista服務(wù)詳解_第2頁
【W(wǎng)indows】 Vista服務(wù)詳解_第3頁
【W(wǎng)indows】 Vista服務(wù)詳解_第4頁
【W(wǎng)indows】 Vista服務(wù)詳解_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Windows Vista 的服務(wù)本文檔提供了一些Windows Vista服務(wù)的相關(guān)信息。對于想在這個版本的Windows上面開發(fā)服務(wù)程序的開發(fā)者們,本文檔也提供了一些最優(yōu)方法。這些信息應(yīng)用在Windows操作系統(tǒng)上。微軟可能會隨時更改本文檔內(nèi)容,可在以下地址獲取最新的英文版本。Windows 服務(wù)概述Microsoft Windows服務(wù)就是程序,通常,它們雖Windows一起啟動,并在后臺運(yùn)行,直到被關(guān)閉。嚴(yán)格一點(diǎn)說,服務(wù)就是所有用服務(wù)API實(shí)現(xiàn)的Windows程序。通常,服務(wù)處理一些低級別的任務(wù),這些任務(wù)很少需要和用戶交互。盡管服務(wù)對于用戶通常是不可見的,但Windows功能又離不開他

2、們。服務(wù)處理許多重要的操作系統(tǒng)功能,包括:1、聯(lián)網(wǎng)。很多系統(tǒng)服務(wù)支持聯(lián)網(wǎng)。比如動態(tài)主機(jī)配置協(xié)議(Dynamic Host Configuration Protocol, DHCP)客戶端服務(wù)通過存儲和更新系統(tǒng)的IP地址來管理網(wǎng)絡(luò)配置。2、硬件。即插即用服務(wù)(Plug and Play)使計算機(jī)可以識別硬件配置的變化并做出響應(yīng),例如用戶添加或者卸載了一個硬件。3、遠(yuǎn)程訪問。終端服務(wù)(Terminal Services)允許用戶在遠(yuǎn)程登陸計算機(jī)。除了Windows自帶的服務(wù),大部分計算機(jī)還會運(yùn)行很多第三方的服務(wù)。見到最多的就是防火墻和防病毒程序。服務(wù)怎樣運(yùn)行服務(wù)和一般程序最主要的區(qū)別是,服務(wù)被服務(wù)

3、控制管理器(Service Control Manager ,SCM)管理。使用服務(wù)API實(shí)現(xiàn)服務(wù),這些API處理服務(wù)和SCM之間的交互。SCM維護(hù)一個數(shù)據(jù)庫,這個數(shù)據(jù)庫放置了所有已安裝服務(wù)的信息,并提供一個統(tǒng)一的方法來控制這些服務(wù):1、開始和停止服務(wù)。2、管理正在運(yùn)行的服務(wù)。3、維護(hù)服務(wù)相關(guān)的狀態(tài)信息。服務(wù)有三種狀態(tài):已運(yùn)行,已停止,已暫停。1、已運(yùn)行是服務(wù)的一般運(yùn)行狀態(tài)。2、已停止的服務(wù)已經(jīng)完全關(guān)閉,必須經(jīng)過一個啟動過程,才能再次進(jìn)入已運(yùn)行的狀態(tài)。3、已暫停服務(wù)中止處理,但是還駐留在內(nèi)存中,并且繼續(xù)響應(yīng)控制請求。以暫停的服務(wù)可以跳過啟動過程直接進(jìn)入以運(yùn)行的狀態(tài)。服務(wù)的一個關(guān)鍵的特征是它怎樣

4、被啟動。SCM管理的數(shù)據(jù)庫里有這樣的信息。有三種啟動模式:1、自動。在系統(tǒng)引導(dǎo)中,SCM自動啟動這些服務(wù)。2、手動。想啟動這類服務(wù),必須利用控制面板中的管理工具。3、禁用。這些服務(wù)不能被啟動。要想啟動這類服務(wù),用戶必須把啟動模式調(diào)整為自動或者手動當(dāng)服務(wù)啟動后,SCM利用控制請求來管理服務(wù)的狀態(tài)。比如,SCM向服務(wù)發(fā)送控制請求,通知服務(wù)暫停,繼續(xù)運(yùn)行,或者準(zhǔn)備關(guān)閉。SCM的數(shù)據(jù)庫也包含了服務(wù)的安全設(shè)置。這些設(shè)置控制服務(wù)有多少權(quán)限去訪問系統(tǒng)資源,也使得系統(tǒng)管理者可以控制每個服務(wù)的權(quán)限。Windows Vista中Windows服務(wù)的變化多年來,服務(wù)已經(jīng)成為Windows一個重要的組成部分。它使得開

5、發(fā)者們可以創(chuàng)建長時間運(yùn)行的程序:1、可以隨計算機(jī)自動啟動。2、可以被暫停和重開。3、無論用戶登陸與否,都能運(yùn)行。4、可以運(yùn)行在一個獨(dú)立的賬戶環(huán)境下,這個賬戶可以不同于已登陸的賬戶和默認(rèn)賬戶。這些特點(diǎn)使得服務(wù)可以長時間的運(yùn)行,而不干擾在同一計算機(jī)上工作的用戶。自從服務(wù)概念的引入,服務(wù)的運(yùn)行環(huán)境已經(jīng)發(fā)生了很大的變化。這些變化已經(jīng)帶來了一些很多問題:安全性、可靠性、性能、操作和管理。這一節(jié),討論一下對于Windows Vista做出的改進(jìn)。安全性增強(qiáng)近些年,服務(wù)已經(jīng)成為那些病毒制造者們的目標(biāo)。最近的例子有:“Blaster”、“ Sasser”、和“Code Red”。對于這個現(xiàn)象,有很多原因:1、

6、服務(wù)基本上都在長時間運(yùn)行。通常,從系統(tǒng)啟動到關(guān)閉,它們都在運(yùn)行。2、服務(wù)通常都是面向網(wǎng)絡(luò)的,這使得他們極易受到遠(yuǎn)程攻擊。3、服務(wù)基本上以高權(quán)限賬戶運(yùn)行,比如LocalSystem。這一節(jié),討論一下對于Windows Vista做出的改進(jìn),這些改進(jìn)為了緩和服務(wù)的安全問題。這些改變有兩個重要的目的:1、限制用戶程序訪問服務(wù)。會話0隔離(Session 0 isolation)要求服務(wù)和用戶程序運(yùn)行在隔離的會話里。2、“固化”服務(wù)使不安全服務(wù)破系統(tǒng)的可能性降低。有以下兩個互補(bǔ)的方法來達(dá)到這個目的:l 最小權(quán)限,使得服務(wù)運(yùn)行在它所需要的權(quán)限范圍內(nèi),做不了其他的事情。l 服務(wù)隔離,利用唯一的服

7、務(wù)標(biāo)識,使服務(wù)如其他服務(wù)和程序隔離開。服務(wù)可以利用這個標(biāo)識來限制其他服務(wù)和程序?qū)λ馁Y源的訪問,也可以限制自己對其他服務(wù)和程序的資源訪問。比如,服務(wù)隔離允許防病毒服務(wù)維護(hù)簽名定義文件的專門入口。以最小權(quán)限運(yùn)行Windows服務(wù)通常以LocalSystem賬戶運(yùn)行,這個賬戶具有系統(tǒng)的最高權(quán)限。這樣的服務(wù)成為病毒制造者很有吸引力目標(biāo)。理想情況下,服務(wù)應(yīng)該以低權(quán)限級的LocalService 或者NetworkService賬戶運(yùn)行,從而減小對系統(tǒng)潛在的破壞。但是,很多服務(wù)需要的一些權(quán)限只有LocalSystem能夠支持。在Windows Vista之前就用的“all-or-nothing”模型意思

8、是,服務(wù)得到了一些LocalSystem的權(quán)限后,它也同時具有了LocalSystem的所有其他權(quán)限。這意味著很多時候,服務(wù)所具有的權(quán)限不是它所需要的,產(chǎn)生對系統(tǒng)潛在的破壞性。Windows Vista允許服務(wù)以最小權(quán)限運(yùn)行,解決了這個問題。服務(wù)不會再被標(biāo)準(zhǔn)賬戶支持的默認(rèn)權(quán)限所限制。服務(wù)可以選擇賬戶,這個賬戶有他們需要的權(quán)限,之后,服務(wù)還可以去掉所有它不需要的權(quán)限。這個功能可以用于所有的賬戶類型:LocalService, NetworkService,LocalSystem,一個域,或者一個本地賬戶。服務(wù)利用一些機(jī)制來聲明他們所需要的權(quán)限,這些機(jī)制將在之后討論。當(dāng)SCM啟動服務(wù)時:1、對于獨(dú)

9、立的服務(wù),SCM逆著對照進(jìn)程標(biāo)記符檢查權(quán)限需求列表,所有沒有被要求的權(quán)限都會被從進(jìn)程標(biāo)識符上去掉。2、對于共享的服務(wù),例如svchost的服務(wù)宿主,在這個組里的所有服務(wù)需要的權(quán)限合并成權(quán)限列表。SCM只將沒有任何一個成員服務(wù)需要的權(quán)限從進(jìn)程標(biāo)識符上刪除。3、如果服務(wù)沒有申明需要的權(quán)限,SCM假設(shè)服務(wù)需要與賬戶相關(guān)的所有權(quán)限。這樣確保了向后兼容性。但是,如果服務(wù)組中有一個這樣的服務(wù),組中的其他服務(wù)也都以賬戶默認(rèn)的一組權(quán)限運(yùn)行。如果進(jìn)程標(biāo)識符里沒有服務(wù)要求的權(quán)限,SCM不會啟動這個服務(wù)。比如,以NetworkService賬戶運(yùn)行的程序可以將SeTcbPrivilege指定為需要的權(quán)限。但是,Ne

10、tworkService進(jìn)程標(biāo)識符不支持SeTcbPrivilege,所以啟動失敗。怎么指定所需權(quán)限1、Sc.exe管理服務(wù)的命令行工具有兩個新命令,支持為服務(wù)指定所需權(quán)限。l privs 這個命令為服務(wù)設(shè)定一個權(quán)限。privs 的語法是:sc <server> privs Privilegesl qprivs 這個命令查詢服務(wù)需要的權(quán)限,qprivs的語法是:sc <server> qprivs service name buffersizePrivileges是一個字符串,包含權(quán)限列表,以斜杠分開(/)。例如,指定備份和恢復(fù)權(quán)限,將Privileges設(shè)置成“SeB

11、ackupPrivilege/SeRestorePrivilege”。2、利用程序指定需要的權(quán)限,以下面的值為參數(shù)調(diào)用ChangeServiceConfig2:l 將dwInfo參數(shù)設(shè)置為SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFOl 使lpInfo指向一個SERVICE_REQUIRED_PRIVILEGES_INFO結(jié)構(gòu)。這個結(jié)構(gòu)包含了一個字符串,字符串列出了需要的權(quán)限。使用QueryServiceConfig2查詢服務(wù)需要的權(quán)限。權(quán)限的變化將在服務(wù)下一次啟動時生效。注意一點(diǎn),不管是命令行工具還是函數(shù),都會檢查列表中的權(quán)限是否有效,但是它們不能確定服務(wù)是否

12、支持指定的權(quán)限。這個工作是由SCM在試圖啟動一個服務(wù)的時候做的。注意:權(quán)限列表只能被那些具有SERVICE_CHANGE_CONFIG權(quán)限的調(diào)用程序更改。默認(rèn)情況下,只有本地管理員,權(quán)力用戶和服務(wù)器操作員可以在遠(yuǎn)程或者本地取得得到這個權(quán)限。具有SERVICE_QUERY_CONFIG權(quán)限的調(diào)用程序可以查詢需要的權(quán)限的列表。默認(rèn)情況下,只有本地管理員,權(quán)力用戶和服務(wù)器操作員可以在遠(yuǎn)程取得得到這個權(quán)限,服務(wù)和交互的用戶可以在本地取得這個權(quán)限。服務(wù)隔離許多服務(wù)需要訪問一些特定的對象,而這些對象只有高權(quán)限賬戶才能訪問。比如,服務(wù)可能要向注冊表寫值,而注冊表只有管理員能夠訪問。在Windows Vist

13、a以前的系統(tǒng)中,服務(wù)以象LocalSystem這樣的高權(quán)限賬戶運(yùn)行,從而得到訪問這些對象的權(quán)限。還有一個做法,就是降低這些對象的安全性,使具有低權(quán)限的服務(wù)已可以訪問它們。這兩個方式都有可能使攻擊者或病毒得到系統(tǒng)的控制權(quán)。對于管理員,唯一可以降低這個風(fēng)險的方法是,建立一個服務(wù)的專有賬戶,只讓這個賬戶具有訪問這些對象的權(quán)限。但是,這樣又帶來了管理效率的問題:大量的密碼管理,因為管理員再也利用不到使用系統(tǒng)內(nèi)置賬戶的好處了。為了緩和這個問題,Windows Vista引入了服務(wù)隔離,它給服務(wù)提供了一個訪問特定對象的方法,既不需要以高權(quán)限運(yùn)行,又不需要降低對象的安全。例如,服務(wù)隔離允許一個反病毒服務(wù)運(yùn)行

14、在比LocalSystem權(quán)限更低的賬戶下,但這個反病毒服務(wù)還能完全訪問它的特征定義文件或者注冊表,通常這些只有管理員可以訪問。服務(wù)隔離是一個專門用來保護(hù)資源(比如訪問文件或者注冊表的訪問)的對象,它有一個包含服務(wù)安全I(xiàn)D(service security ID , SID)的權(quán)限控制表。我們把這個ID叫做“per-service SID”,它來源于服務(wù)的名字,對于服務(wù)是唯一的。SID被分配給服務(wù)之后,服務(wù)的所有者就可以更改所需的對象的權(quán)限控制列表(access control lists, ACLs),使得服務(wù)可以訪問這個對象。例如,具有管理權(quán)限的服務(wù)才能夠訪問注冊表鍵值HKEY_LOCAL

15、_MACHINESOFTWARE。把per-service SID添加到這個鍵值的ACL里,服務(wù)就可以運(yùn)行在權(quán)限更低的賬戶下,但還可以訪問這個鍵值。如果per-service SID被啟用,它被添加到服務(wù)的進(jìn)程標(biāo)識符里。注意,在服務(wù)的進(jìn)程被添加到進(jìn)程標(biāo)識符里的同時,必須啟用per-service SID。per-service SID也允許,向進(jìn)程標(biāo)識符里添加幾個SID之后,把進(jìn)程標(biāo)識符轉(zhuǎn)換成一個限制標(biāo)識符。利用受限SID減少潛在破壞使用per-service SID,提供了良好的隔離程度,并且允許服務(wù)運(yùn)行在更低的權(quán)限賬戶下。但是,它并不阻止服務(wù)訪問賬戶可以訪問的資源,因為進(jìn)程標(biāo)識符包含了賬戶

16、的SID??紤]下面的情況:X服務(wù)以LocalService賬戶運(yùn)行,并且啟用了SID。除了可以訪問已經(jīng)明確給予它訪問權(quán)限的那些對象,它還可以訪問LocalService賬戶可以訪問的所有對象。如果這個服務(wù)涉及安全問題,攻擊者可能利用它訪問與這個服務(wù)不相關(guān)的資源,從而破壞系統(tǒng)。為了緩和這個問題,降低涉及安全問題的服務(wù)對系統(tǒng)造成破壞的可能性,Windows Vista結(jié)合寫限制標(biāo)識符(write-restricted tokens)和per-service SID為服務(wù)引入受限SID。服務(wù)啟用受限SID時,服務(wù)的SID被添加到寫限制服務(wù)進(jìn)程標(biāo)識符的正常和受限SID列表中。這樣保證了,只有明確地將對

17、象的寫權(quán)限賦予受限列表中的SID時,服務(wù)才可以寫對象?;氐缴厦娴睦?,啟用受限SID,X服務(wù)將沒有權(quán)限寫入訪問LocalService賬戶可以訪問的對象,因為服務(wù)X的per-service SID沒有被明確地賦予這些對象的寫權(quán)限。怎樣指定per-service SID1、要指定per-service SID,SID的種類必須設(shè)定為SERVICE_SID_TYPE_UNRESTRICTED。如果服務(wù)不需要SID,可以不設(shè)置SID類型,或者把它設(shè)置為SERVICE_SID_TYPE_NONE。設(shè)置了類型之后,SID在下一次進(jìn)程創(chuàng)建的時候被添加到進(jìn)程標(biāo)識符里??捎靡韵聝煞N屬性激活SID:l SE_G

18、ROUP_ENABLED_BY_DEFAULTl SE_GROUP_OWNER存取控制表也擴(kuò)充了服務(wù)的進(jìn)程標(biāo)識符,它為服務(wù)登陸SID提供GENERIC_ALL權(quán)限。這就允許在服務(wù)啟動或者停止的時候,激活或者禁用進(jìn)程標(biāo)識符中服務(wù)的SID。SID被添加到進(jìn)程標(biāo)識符之后,它就不能被去掉了。SID的類型必須改變,之后進(jìn)程必須被重新利用。這個改變只會發(fā)生在進(jìn)程重開的時候。2、要把進(jìn)程標(biāo)識符設(shè)置成寫入限制的。SID必須設(shè)置成為SERVICE_SID_TYPE_RESTRICTED。使用SERVICE_SID_TYPE_RESTRICTED類型,必須要考慮幾個問題。l 如果進(jìn)程包含多個服務(wù),所有的這些服務(wù)都

19、必須設(shè)置成SERVICE_SID_TYPE_RESTRICTED。否則,設(shè)置成為SERVICE_SID_TYPE_RESTRICTED的服務(wù)都會啟動失敗。l 三個SID被自動地加入到受限列表:Ø 通用SID(World SID)(S-1-1-0)。這個SID為服務(wù)提供所有ACL支持通用SID的對象的寫權(quán)限。通用SID提供訪問裝載路徑中的一些動態(tài)連接庫的權(quán)限。Ø 服務(wù)登陸SID。這個SID提供那些連接服務(wù)進(jìn)程和SCM的命名管道的寫權(quán)限。Ø 寫限制SID(S-1-5-33)。這個SID允許對象擁有一個ACL,使得所有寫限制的服務(wù)進(jìn)程可以寫入對象。一個常見的例子就是Wi

20、ndows的事件跟蹤對象(event tracing for Windows (ETW) objects)。3、Sc.exe有兩個支持per-service SID的新命令:l Sidtype。這個命令改變服務(wù)的SID。命令的語法為:sc <server> sidtype service name typel Qsidtype。這個命令找回服務(wù)的SID設(shè)置。命令的語法為:sc <server> qsidtype service name4、如果要編程設(shè)置這個標(biāo)志,調(diào)用ChangeServiceConfig2,用下面的屬性值作參數(shù)。在系統(tǒng)下一次啟動時,改變將會生效:l 將

21、dwInfo設(shè)置為SERVICE_CONFIG_SERVICE_SID_INFO。l 使lpInfo指向一個SERVICE_SID_INFO結(jié)構(gòu)。這個結(jié)構(gòu)包含一個DWORD成員,這個成員包含SID類型。5、兩個關(guān)聯(lián)的公共函數(shù)對于服務(wù)所有者也很有用:l LookupAccountName,傳入SID,返回相關(guān)的服務(wù)名。l LookupAccountSID,傳入服務(wù)名,返回相關(guān)的SID。6、也可使用Sc.exe來得到指定的服務(wù)的服務(wù)SID。下面的命令返回一個服務(wù)的SID。Sc showsid service name注意:調(diào)用者必須擁有SERVICE_CHANGE_CONFIG權(quán)限才能改變這些設(shè)置

22、。默認(rèn)情況下,只有管理員,權(quán)力用戶,服務(wù)器操作員可以在遠(yuǎn)程或者本地得到這個權(quán)限。另外,服務(wù)和交互用戶可以在本地得到SERVICE_CHANGE_CONFIG權(quán)限。受限的網(wǎng)絡(luò)訪問很多服務(wù)都是面向網(wǎng)絡(luò)的,使得他們很容易受到遠(yuǎn)程攻擊。服務(wù)固化在Windows Vista和Microsoft Windows Server® Code Name "Longhorn"中,這樣允許開發(fā)者減少服務(wù)對網(wǎng)絡(luò)資源的訪問,這些資源包括端口、協(xié)議、網(wǎng)絡(luò)通信方向。比如,DHCP服務(wù)更新系統(tǒng)的IP地址可以把它自己限制到本地68端口,入站的用戶數(shù)據(jù)報協(xié)議通信在遠(yuǎn)程的67端口。打開或者監(jiān)聽其他端口

23、的企圖,都會被Windows Vista和Windows Server Longhorn的防火墻阻止。Windows Vista和Windows Server Longhorn支持下面這幾種服務(wù)網(wǎng)絡(luò)限制的情況:情況舉例限制無網(wǎng)絡(luò)權(quán)限Shell 硬件檢測服務(wù) (ShellHWDetection)服務(wù)不可能監(jiān)聽或者連接到網(wǎng)絡(luò)監(jiān)聽靜態(tài)的TCP或者UDP端口遠(yuǎn)程過程調(diào)用服務(wù)(Rpcss),在135端口上服務(wù)只能監(jiān)聽指定的終端監(jiān)聽可配置的TCP或者UPD端口域名服務(wù)(DNS)服務(wù)可以監(jiān)聽配置的終端服務(wù)網(wǎng)絡(luò)限制和per-service SIDS一起使用。這個機(jī)制有點(diǎn)像用于限制服務(wù)的文件或注冊表的權(quán)限,這在

24、“服務(wù)隔離”中討論過了。Windows Vista和Windows Server Longhorn的防火墻API已經(jīng)被加強(qiáng),提供這些必要的支持。INetFwServiceRestriction接口包含了限制服務(wù)網(wǎng)絡(luò)權(quán)限的方法。要取得更多信息,請看“因特網(wǎng)連接共享和因特網(wǎng)連接防火墻”,在本文檔最后的“資源”一章。下面的Microsoft Visual Basic腳本使用防火墻API,把6to4服務(wù)限制到端口500,只接受入站。'require variable declarationsoption explicit'handle errorson error resume nex

25、t'directionConst NET_FW_DIRECTION_IN = 1' Create the FwPolicy2 object.Dim fwPolicy2Set fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")Dim FwSvcRestrSet FwSvcRestr = fwPolicy2.ServiceRestriction'restrict serviceFwSvcRestr.RestrictService "6to4", "c:windowssystem32sv

26、chost.exe", TRUE, TRUE'Create a new restriction ruleDim NewRuleset NewRule = CreateObject("HNetCfg.FwRule")NewRule.Name = "6to4 500"NewRule.Description = "Allow 6to4 to receive TCP traffic on port 500"NewRule.ApplicationName = "c:windowssystem32svchost.exe

27、"NewRule.ServiceName = "6to4"NewRule.Protocol = 6NewRule.LocalPorts = "500"NewRule.Direction = NET_FW_DIRECTION_INNewRule.Enabled = TRUE'Add the behavior rule to the WSH store.fwPolicy2.ServiceRestriction.Rules.Add NewRule會話0隔離Windows把每個同時登陸的用戶放到不同的會話里面,從而提供多用戶登陸功能。系統(tǒng)啟動中

28、建立會話0,如果需要,還會建立更多會話。在Windows Vista之前的系統(tǒng)中,服務(wù)總是運(yùn)行在會話0中,用戶程序也可以運(yùn)行在會話0中。比如,Windows XP激活快速用戶切換(Fast User Switching, FUS)后,第一個登陸的用戶被分配到會話0,這個用戶的所有程序也運(yùn)行在會話0下。第二個登陸到系統(tǒng)的用戶就被分配到會話1上,如此等等。1、服務(wù)和用戶程序運(yùn)行在同一個會話里,造成了很多安全問題。為了解決這個問題,Windows Vista對會話0作了兩個重要的改變。l 會話0被留用給那些所有與交互用戶會話沒有關(guān)系的服務(wù)和其他程序。用戶程序必須運(yùn)行在會話1上,或更高的會話上。l 會

29、話0不支用戶界面。詳細(xì)點(diǎn)說,運(yùn)行在會話0上的程序沒有權(quán)限使用圖形硬件,不會在顯示器上顯示用戶界面。2、對于服務(wù),會話0隔離還有很多隱含的意義,包括:l 服務(wù)不能使用PostMessage或者SendMessage向用戶程序發(fā)送消息。運(yùn)行在會話1和其他會話上的程序都有不同的消息隊列。同理,程序也不能向服務(wù)發(fā)送Windows消息。服務(wù)要給程序發(fā)送消息,必須利用一些類似于遠(yuǎn)程過程調(diào)用或者命名管道的機(jī)制。l 具有用戶界面的服務(wù)比如有一個對話框不能在Windows Vista中直接顯示出來。服務(wù)只能間接的處理和用戶的交互。對于簡單的交互,服務(wù)可以調(diào)用WTSSendMessage,在用戶的會話上顯示一個消

30、息窗。對于復(fù)雜的交互,服務(wù)必須調(diào)用CreateProcessAsUser或使用其他方法,在用戶的會話上創(chuàng)建一個用戶界面程序。這個界面程序處理用戶的交互,并且使用遠(yuǎn)程過程調(diào)用戶或者命名管道來個服務(wù)通信。要取得更多有關(guān)Windows Vista中會話0的信息,以及編寫Windows Vista服務(wù)的指導(dǎo)信息,請看本文檔末尾“Windows Vista服務(wù)和驅(qū)動的會話0隔離帶來的影響”一章。性能的增強(qiáng)延時自動啟動在Windows Vista之前,有兩個啟動服務(wù)的方法:自動啟動和按需啟動。自動啟動的服務(wù)在系統(tǒng)引導(dǎo)的時候啟動。有幾種方法可以啟動按需啟動的服務(wù),但這些都需要用戶手動崇啟這些服務(wù)。1、把一個

31、服務(wù)定義成自動啟動服務(wù),主要原因有兩個:l 這個服務(wù)必須在引導(dǎo)程序中較早的啟動,因為其他服務(wù)依賴它。l 管理員通常需要一些沒有用戶交互的服務(wù)無人值守地啟動。這樣保證在需要時,服務(wù)總是可用的。自動啟動服務(wù)的問題是,它們數(shù)量不斷增加,影響了系統(tǒng)啟動的速度。但是,很多服務(wù)屬于上面兩種原因中的第二種。它們并不需要成為系統(tǒng)引導(dǎo)隊列的一部分;只是在系統(tǒng)啟動完成之后,它們可以無人值守地啟動,并且在需要時隨時可用。Windows Vista提供了一個不同的自動啟動模式延時啟動,解決了在引導(dǎo)過程中,服務(wù)對性能的影響。被指定成為延時自動啟動的服務(wù)會在系統(tǒng)啟動完成后,自動啟動。他們不會在系統(tǒng)引導(dǎo)的過程中自動啟動,只

32、是在系統(tǒng)引導(dǎo)完成后稍短的時間內(nèi)啟動。這樣不僅提高了系統(tǒng)引導(dǎo)性能,還可以使服務(wù)無人值守地啟動。2、在把服務(wù)指定為延時自動啟動之前,開發(fā)人員和管理員們應(yīng)該考慮下面幾個問題:l 了解服務(wù)的依賴。如果因為另一個必須在引導(dǎo)過程中啟動的服務(wù)依賴這個服務(wù),就不要把這個服務(wù)標(biāo)記成為延時啟動服務(wù)。SCM會忽略標(biāo)記設(shè)置而在引導(dǎo)過程中啟動這個服務(wù)。l 對于延時啟動服務(wù),沒有明確的延時時間。如果用戶程序在延時服務(wù)啟動之前試圖使用它,將會失敗。如果用戶程序依賴一個延時啟動服務(wù),它就應(yīng)該處理這種失敗情況,或者一段時間后重試,或者調(diào)用StartService啟動服務(wù)。如果這樣的失敗情況總是發(fā)生,可能把服務(wù)設(shè)置成延時啟動并不

33、是一個好選擇。l 延時啟動服務(wù)不屬于裝載順序組(load-order group)。它們屬于獨(dú)立組(stand-alone)。怎樣服務(wù)指定為延時自動啟動要將創(chuàng)建一個延時自動啟動服務(wù),就設(shè)置延時自動啟動標(biāo)志。雖然所有服務(wù)都能設(shè)置這個標(biāo)志,但它只對自動啟動服務(wù)有效。如果自動啟動服務(wù)被設(shè)置成為延時自動啟動,那么在引導(dǎo)隊列完成以后,它才會被啟動。其他啟動類型會忽略這個標(biāo)志。1、Sc.exe有兩個支持延時自動啟動的命令l delayflag。這個命令改變延時自動啟動標(biāo)志的設(shè)置。命令的語法為:sc server delayflag service name flagl qdelayflag。這個命令查詢延

34、時自動啟動標(biāo)志的設(shè)置。命令的語法為:sc server qdelayflag service name2、通過程序設(shè)置延時自動啟動標(biāo)志,可以使用ChangeServiceConfig2函數(shù),用下面的制作參數(shù)。改動會在下一次系統(tǒng)引導(dǎo)的時候生效。l 將dwInfo設(shè)置為SERVICE_CONFIG_DELAYED_AUTO_START_INFO。l 使lpInfo指向一個SERVICE_DELAYED_AUTO_START_INFO結(jié)構(gòu)。這個結(jié)構(gòu)包含一個布爾型變量,設(shè)置或者清除延時自動啟動標(biāo)志。注意:具有SERVICE_CHANGE_CONFIG權(quán)限的調(diào)用者才可以修改延時自動啟動標(biāo)志。默認(rèn)的,只有

35、本地管理員,權(quán)力用戶和服務(wù)器操作員能在遠(yuǎn)程取得這個權(quán)限。服務(wù)和交互用戶可以在本地取得SERVICE_CHANGE_CONFIG權(quán)限。服務(wù)狀態(tài)改變的通知在Windows Vista之前,使用服務(wù)查詢API,比如QueryServiceStatusEx函數(shù),來確定一個服務(wù)狀態(tài)的變化,是被創(chuàng)建還是被刪除;重復(fù)查詢服務(wù)的狀態(tài)。不斷重復(fù)查詢會降低系統(tǒng)的性能,所以它不是最好的方法。另外,重復(fù)查詢也成為一個重要資源的BUG。Windows Vista引入了一個新的函數(shù),NotifyServiceStatusChange,這個函數(shù)允許SCM在服務(wù)被創(chuàng)建、刪除、狀態(tài)改變的時候給客戶程序發(fā)出通知。怎樣在服務(wù)狀態(tài)改

36、變的時候得到通知通過注冊來取得狀態(tài)變化通知,客戶程序通過調(diào)用NotifyServiceStatusChange指定服務(wù),改變它想要得到通知的服務(wù)。它們也向SCM提供了一個回調(diào)函數(shù)。1、下面列出了一些使用NotifyServiceStatusChange應(yīng)該注意的一項事項:l 本地和遠(yuǎn)程客戶程序都可以使用NotifyServiceStatusChangel 回調(diào)函數(shù)只被調(diào)用一次。如果客戶端想繼續(xù)得到變化的通知,它必須再次調(diào)用NotifyServiceStatusChange,注冊回調(diào)函數(shù)。l 客戶程序可以利用CloseServiceHandle關(guān)閉服務(wù)句柄,從而取消通知。l 在回調(diào)函數(shù)被調(diào)用或者

37、通知被取消之前,不要中止調(diào)用了NotifyServiceStatusChange的線程,否則將會發(fā)生內(nèi)存泄漏。l 如果有一個或幾個服務(wù)持有一個服務(wù)的打開句柄,那么直到下一次系統(tǒng)啟動,這個服務(wù)才會被刪除。在這個情況下,不會發(fā)送刪除通知。注意:必須擁有SERVICE_QUERY_STATUS權(quán)限才能調(diào)用NotifyServiceStatusChange。默認(rèn)的,只有管理員,權(quán)力用戶和服務(wù)器操作員可以在遠(yuǎn)程取得這個權(quán)限。服務(wù)和交互用戶可以在本地取得這個權(quán)限。其他增強(qiáng)Windows Vista還包含了一些其他的服務(wù)增強(qiáng)機(jī)制,它們增強(qiáng)了可靠性,使管理變得更加簡單。預(yù)關(guān)閉通知和關(guān)閉順序在Windows V

38、ista之前,系統(tǒng)通知SCM計算機(jī)要關(guān)閉了。在系統(tǒng)中止SCM進(jìn)程(services.exe)之前,SCM有大約20秒的時間去關(guān)閉所有運(yùn)行中的服務(wù)。通常因為這個過程,服務(wù)都沒有及時地關(guān)閉自己。1、當(dāng)SCM收到關(guān)閉通知以后,它以一個隨機(jī)的順序依次向每一個服務(wù)發(fā)送關(guān)閉請求。每一個服務(wù)都有一個等待時間點(diǎn)(wait hint),這個時間點(diǎn)指定SCM應(yīng)該等待多長時間后,直接關(guān)閉這個服務(wù)。當(dāng)SCM等待的時間超過這個等待時間點(diǎn)時,SCM就直接將服務(wù)關(guān)閉。這種關(guān)閉模式給服務(wù)帶來了兩個問題:l 關(guān)閉順序是隨機(jī)的。如果有一個服務(wù)需要其他服務(wù)以一個特定的順序關(guān)閉,那么,它可能不會被正確地關(guān)閉。l 一些服務(wù)可能沒有足夠

39、的時間作充分的清理工作。這個清理工作常常需要在服務(wù)再次啟動的時候完成,這又會導(dǎo)致服務(wù)啟動時間過長,或者數(shù)據(jù)不一致。2、Windows Vista用兩個方法來處理這些服務(wù)關(guān)閉問題:l SCM在發(fā)送真正的關(guān)閉通知之前先發(fā)送一個預(yù)關(guān)閉通知。預(yù)處理通知使得服務(wù)的關(guān)閉處理有了更長的時間,從而正確的關(guān)閉。l 那些依賴于服務(wù)關(guān)閉順序的服務(wù),可以向全局依賴列表里添加任何依賴。預(yù)關(guān)閉通知的工作方式和關(guān)閉通知很像。SCM以一個隨機(jī)的順序向注冊過的服務(wù)發(fā)送預(yù)關(guān)閉通知。發(fā)送通知之后,SCM會在一個指定的時間量內(nèi)等待服務(wù)停止,超過這個指定的時間量,SCM就認(rèn)為服務(wù)沒有響應(yīng)。默認(rèn)情況下,這個時間量為3分鐘,但服務(wù)為了滿足

40、特別需要,也可以配置這個時間量。要取得更多信息,請看本文當(dāng)最后“資源”中的“服務(wù)控制句柄和函數(shù)”一章。服務(wù)可以在一個全局的依賴列表里面指定關(guān)閉依賴,在關(guān)閉一個服務(wù)之前,SCM首先嘗試關(guān)閉依賴服務(wù)。要利用這個特點(diǎn),就要為服務(wù)注冊一個預(yù)關(guān)閉通知。如果服務(wù)指定了依賴,關(guān)閉程序也會同時進(jìn)行。比如,一個服務(wù)按照順序指定對服務(wù)“A”、“B”、“C”的依賴。SCM向“A”發(fā)送一個通知后,等待它停止或超時。接著給“B”發(fā)送通知等等。如果這些服務(wù)中的任何一個沒有注冊預(yù)關(guān)閉通知或者沒有正確關(guān)閉,SCM會直接處理下一個服務(wù)。怎樣注冊一個預(yù)關(guān)閉通知服務(wù)在它們的狀態(tài)塊中設(shè)置SERVICE_ACCEPT_PRESHUTD

41、OWN來注冊預(yù)關(guān)閉通知。預(yù)關(guān)閉通知只會發(fā)送給正在運(yùn)行的并且已經(jīng)注冊了通知的服務(wù),不會發(fā)送給處于SERVICE_STOPPED或者 SERVICE_STOP_PENDING狀態(tài)的服務(wù)。要設(shè)置超時時間值,調(diào)用ChangeServiceConfig2函數(shù),并使用下面的參數(shù):dwInfoLevel把這個參數(shù)設(shè)置成為SERVICE_CONFIG_PRESHUTDOWN_INFOlpInfo 讓這個參數(shù)指向SERVICE_PRESHUTDOWN_INFO結(jié)構(gòu)體,結(jié)構(gòu)體中的dwPreshutdownTimeout成員就是超時時間值,毫秒級。怎樣聲明關(guān)閉順序要聲明關(guān)閉順序,創(chuàng)建一個多字符值,這個值應(yīng)該包含服務(wù)

42、的名稱,他們應(yīng)該按照關(guān)閉的順序排列。把這個多字符值賦給控制鍵的PreshutdownOrder,類似下面這樣:HKEY_LOCAL_MACHINE System CurrentControlSet Control PreshutdownOrder="Shutdown Order"錯誤檢測及恢復(fù)如果一個服務(wù)啟動失敗了,SCM會進(jìn)行一個錯誤處理(failure action),比如重新啟動這個出錯的服務(wù),使之從錯誤中恢復(fù)。在Windows Vista之前的版本中,服務(wù)錯誤的定義僅限于,進(jìn)程在任意狀態(tài)下崩潰(不包含SERVICE_STOPPED狀態(tài))。在Windows Vista

43、中,如果服務(wù)發(fā)現(xiàn)了一個不是致命的錯誤,比喻說內(nèi)存泄漏。服務(wù)可以不必停止。它可以通知SCM做一些錯誤處理,從而恢復(fù)。怎樣配置錯誤處理只有在服務(wù)顯式的聲明之后,SCM才會不斷嘗試錯誤處理。最常見的就是“重新啟動這個服務(wù)”。這個動作需要兩個值:l 恢復(fù)時間(recovery interval):單位是毫秒,SCM在這個指定的時間過后,開始恢復(fù)動作。l 重置時間(reset period):單位是秒,SCM在這個指定的時間過后,將錯誤計數(shù)置零。配置錯誤處理的一個方法是利用sc.exe。下面的例子給出典型的語法:sc.exe "failure" option, reset=300,actions=restart/60000/restart/120000/restart/none這條命令告訴SCM:l 在第一次錯誤發(fā)生后,等待60秒,重新啟動服務(wù)l 在第二次服務(wù)發(fā)生后,等待120秒,重新啟動服務(wù)l 在第三次錯誤發(fā)生后,什么都不做。這時,另一個常用的錯誤處理是重新啟動系統(tǒng)。要想重啟系統(tǒng),把&qu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論