?? 3.1.1 服務(wù)應(yīng)用程序.htm
字號:
size=2>Workstation</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>提供網(wǎng)路連結(jié)與通訊。</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>Services.exe</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>Microsoft還提出了許多沒有列在表3-1中的服務(wù),像是Microsoft Exchange
Server、Microsoft Merchant Server以及Microsoft SQL
Server等,所有的這些服務(wù)應(yīng)用程序皆被實作成服務(wù),并且是Microsoft BackOffice套件的一部份。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>首先,最重要的是一個服務(wù)應(yīng)程序只是一個32位元或64位元的可執(zhí)行檔,所以任何您已知之有關(guān)DLLs、結(jié)構(gòu)化例外處理、內(nèi)存應(yīng)對檔、虛擬內(nèi)存、設(shè)備I/O、本機線程儲存、線程同步、Unicode以及其他Windows工具皆可用于服務(wù)上。這表示對您來說,要轉(zhuǎn)換一個已存在的伺服應(yīng)用程序到服務(wù)應(yīng)用程序應(yīng)該相當容易且簡單。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">說明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在Microsoft Windows 2000 Resource
Kit中包含了一個工具程序,叫做SrvAny.exe,它允許從遠端啟動一個已存在的應(yīng)用程序,就像是一個真實的服務(wù)應(yīng)用程序一般。然而,SrvAny并不允許以任何方式透過遠端來管理應(yīng)用程序,因此應(yīng)該僅僅當作一個短期的解決辦法使用。強烈地建議您將應(yīng)用程序代碼轉(zhuǎn)成一個成熟的服務(wù)應(yīng)用程序并且不要使用SrvAny工具程序。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>第二,您應(yīng)該要知道一個服務(wù)完全沒有使用者介面的部份。大部份的服務(wù)鎖在一個隱密地方的服務(wù)器上執(zhí)行。所以您的服務(wù)若出現(xiàn)任何的使用者介面元件,像訊息對話方塊,此時不會有使用者在機器前面看見它并按下它的按鈕。就如您稍后會在本章看到的一樣,任何出現(xiàn)的視窗可能會展現(xiàn)在一個時常變換使用者的工作站或是桌面上,如此一來,這個訊息的顯示對使用者來說并沒有意義。因為服務(wù)不會有使用者介面,所以無論您選擇將您的服務(wù)實作成一個圖形使用者介面(Graphical
User Interface, GUI)應(yīng)用程序(以(w)WinMain做為程序的進入點)或是Console User
Interface(CUI)應(yīng)用程序(以(w)main做為程序的進入點)都沒有關(guān)系。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>假如一個服務(wù)不會顯示任何的使用者介面,您要如何設(shè)定它呢?您要如何啟動與停止一個服務(wù)?要如何送出服務(wù)的警告或錯誤訊息呢?如何使服務(wù)將關(guān)于執(zhí)行效能的統(tǒng)計資料報告出來?這些問題的答案即是:一個服務(wù)可以被遠端地管理。Windows提供一些管理的工具,這些工具能從其他連接到網(wǎng)路上的機器管理一個服務(wù)的執(zhí)行,所以不需要為了某人而去實際地確認(甚至是實際去存取)執(zhí)行服務(wù)的電腦。您可能早已熟悉以下這些工具:Microsoft
Management
Console(MMC)與其服務(wù)、事件檢視器與系統(tǒng)監(jiān)視器之嵌入式管理單元、登錄編輯器與Net.exe命令列工具。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>這些工具是Windows為了簡化服務(wù)應(yīng)用程序編寫者之開發(fā)所提供的工具,也能使一個管理者以一致的方式去管理本機與遠端的機器。請注意,這些工具并非專門用在服務(wù)中,任何應(yīng)用程序(或設(shè)備驅(qū)動程序)都可以利用它們。本書將在章節(jié)里討論這些工具。</FONT></P></A><A
style="LINE-HEIGHT: 25px" name=203001>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7
size=5><B style="LINE-HEIGHT: 25px">Windows服務(wù)通訊架構(gòu)<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>建立服務(wù)的工作需要以下叁種元件:</FONT></P><FONT style="LINE-HEIGHT: 25px"
face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 服務(wù)控制管理員(Service Control
Manager,SCM,讀作scum) </B></FONT>Windows
2000系統(tǒng)皆會包含服務(wù)控制管理員。這個元件存在Services.exe文件中,當作業(yè)系統(tǒng)啟動以及系統(tǒng)關(guān)機時,它便會自動地被呼叫。SCM使用系統(tǒng)特權(quán)執(zhí)行并提供一個統(tǒng)一與安全之控制服務(wù)應(yīng)用程序的方法。SCM負責(zé)與許多服務(wù)溝通,告知它們開始啟動、停止、暫停、繼續(xù)等等。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 服務(wù)應(yīng)用程序 </B></FONT>服務(wù)只是一個包含與SCM溝通所需基礎(chǔ)的應(yīng)用程序,傳送命令給服務(wù),告知啟動、停止、暫停、繼續(xù)或停止工作。服務(wù)也會呼叫一些特定的函數(shù),以將它的狀態(tài)送回SCM。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 服務(wù)控制程序(Service Control Program,
SCP) </B></FONT>這是一個通常會顯示使用者介面,允許使用者去啟動、停止、暫停、繼續(xù)以及其他所有安裝在機器上之服務(wù)的控制。服務(wù)控制程序呼叫一些與SCM溝通的特定Windows函數(shù)。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>圖3-1說明了那些元件間彼此溝通的方式。注意SCP應(yīng)用程序并沒有直接與服務(wù)溝通;所有的通訊都會通過SCM。這里明確地說明了建立通過SCP與服務(wù)應(yīng)用程序之遠端管理的架構(gòu)。實作一個使您的SCP應(yīng)用程序直接與您的服務(wù)應(yīng)用程序溝通的架構(gòu)與通訊協(xié)定是可以的,但是您必須自己編寫它們的訊程序代碼。</FONT></P>
<P><BR style="LINE-HEIGHT: 25px"> </P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=1
style="WIDTH: 618px; LINE-HEIGHT: 25px; HEIGHT: 298px" type=image
height=357 width=736 src="3.1.1 服務(wù)應(yīng)用程序.files/3-1.gif" size=1
border=0 onclick="imgclick"></P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 圖3-1 </B></FONT>Windows服務(wù)的通訊機制</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在這叁個部分中, 您絕對不會執(zhí)行到SCM。Microsoft實作了SCM并將它封裝到每一個Windows
2000的版本中。您要實作的是服務(wù)與SCPs。本章會涵蓋您應(yīng)該了解之設(shè)計與實作服務(wù)的內(nèi)容,而在下一章則會說明編寫SCP的細節(jié)。</FONT></P></A><A
style="LINE-HEIGHT: 25px" name=203002>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7
size=5><B style="LINE-HEIGHT: 25px">包含在Windows中的服務(wù)控制程序(SCP)<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在我們探討如何編寫一個服務(wù)之前,您至少必需知道一個SCP可以控制一個服務(wù)。所以我會開始檢查一些包含在Windows中的SCP應(yīng)用程序。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">服務(wù)嵌入式管理單元<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您應(yīng)該要最熟悉的SCP應(yīng)用程序是服務(wù)嵌入式管理單元,如圖3-2所示。這個嵌入式管理單元顯示了所有安裝在目的機器上的服務(wù)清單。在名稱與描述欄中可以發(fā)現(xiàn)每個服務(wù)的名稱并提供服務(wù)函數(shù)的說明資訊。狀態(tài)欄顯示著哪一個服務(wù)是啟動、暫停或停止(空白項表示「已停止」)。啟動類型欄顯示著什么時候應(yīng)該喚起服務(wù),而登入身份欄則顯示了當服務(wù)執(zhí)行時所使用的安全性內(nèi)容。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>這個資訊保存在SCM的資料庫中,并存在以下子機碼(Subkey)的登錄中:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您應(yīng)該不會直接存取到這個子機碼;反之,SCP應(yīng)該呼叫Windows函數(shù)(在下一章討論)并操作這個子機碼中的資料庫。直接地修改這個機碼內(nèi)容會發(fā)生不可預(yù)料的結(jié)果。當您安裝一個包含服務(wù)的產(chǎn)品時,該產(chǎn)品的安裝程序即是一個增加服務(wù)資訊到SCM資料庫的SCP應(yīng)用程序。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您可以在電腦管理主控臺左邊窗格中選擇電腦管理節(jié)點,以及從執(zhí)行功能表中選擇連線到另一臺電腦,來觀看一個遠端SCM的服務(wù)資料庫。</FONT></P>
<P><BR style="LINE-HEIGHT: 25px"> </P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=2 style="LINE-HEIGHT: 25px" type=image height=446
width=610 src="3.1.1 服務(wù)應(yīng)用程序.files/3-2.gif" border=0
onclick="imgclick"></P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 圖3-2 </B></FONT>服務(wù)嵌入式管理單元</FONT></TD></TR></TBODY></TABLE></CENTER>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">說明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>所有包含在Windows中的服務(wù)皆會以本機安全內(nèi)容登入。這是一個享有高度特權(quán)的帳號,而且強烈建議您所編寫的任何服務(wù)也要使用本機帳號。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>現(xiàn)在您會開始看到服務(wù)嵌入式管理單元,您可能會懷疑是否能夠用它來完成所有的任務(wù)。這里是一些普通的操作:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 啟動一個服務(wù) </B></FONT>管理者可以從清單選擇并按下工具列上的啟動按鈕來啟動一個服務(wù)。只有啟動類型為自動或手動的服務(wù)可以被啟動,停用的服務(wù)則不行。停用一個服務(wù)在解決機器上的問題時是非常有用的。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 停止一個服務(wù) </B></FONT>管理者要停止一個服務(wù)時,只需選擇一個服務(wù)并按下工具列上的停止按鈕即可。要注意有一些服務(wù)在它們啟動后并不允許它們自己停止。事件記錄服務(wù)即是一個例子,它只有在機器關(guān)機時才能停止。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 暫停與繼績執(zhí)行一個服務(wù) </B></FONT>當管理者選擇一個正在執(zhí)行的服務(wù)并按下工具列上的暫停鈕后,即可暫停一個服務(wù)的執(zhí)行。注意大部份的服務(wù)并不允許它們自己暫停執(zhí)行。也要注意「暫停」并沒有明確的定義,對于一個服務(wù),暫停表示在該服務(wù)完成了那些未解決的要求前不會再接受客戶端的要求;對另一個服務(wù)來說,暫停執(zhí)行表示該服務(wù)不能再處理任何操作。暫停服務(wù)可以在按工具列上的啟動鈕時被繼續(xù)執(zhí)行。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 重新啟動一個服務(wù) </B></FONT>管理者可以透過選擇一個正在執(zhí)行或被暫停的服務(wù)并且按下工具列上的重新啟動鈕來重新啟動一個服務(wù)。重新啟動一個服務(wù)會引起一個停止該服務(wù)然后啟動該服務(wù)的動作。這是一個簡單方便的特色,而且當您在對您的服務(wù)進行除錯時,這個功能會非常有幫助。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>前面的清單說明了百分之九十九的管理者所做的服務(wù)嵌入式管理單元工作,但是嵌入式管理單元也可以被用來重新設(shè)定一個服務(wù)。要改變一個服務(wù)器的設(shè)定時,您要選擇服務(wù)并且顯示出它的內(nèi)容對話方塊。這個對話方塊包含了四個頁簽,每一個頁簽皆允許管理者去重新設(shè)定所選的服務(wù)。以下的章節(jié)中會討論更改設(shè)定的部份。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
size=3><B style="LINE-HEIGHT: 25px">一般頁簽的內(nèi)容<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>一般頁簽(如圖3-3所示)允許管理者去檢查與重新設(shè)定服務(wù)的一般資訊。您需要去了解的第一個真相是,每一個服務(wù)都有兩個字串名稱:一個內(nèi)部名稱(使用于計劃性的目的)以及一個顯示名稱(一個顯示給管理者與使用者看的字串)。在被加入服務(wù)資料庫后,服務(wù)的內(nèi)部名稱即不能改變,但是管理者可以修改該服務(wù)的顯示名稱與內(nèi)容。一般頁簽中也顯示服務(wù)的執(zhí)行程序路徑,而它并不允許管理者改變它(這是一個使用頁簽的限制,并非系統(tǒng)的)。管理者可以改變服務(wù)的啟動類型至以下所列之一:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 自動 </B></FONT>服務(wù)的其中一個特色即是SCM可以自動地啟動。假如該服務(wù)有一個設(shè)定為自動的啟動類型,則SCM會在作業(yè)系統(tǒng)啟動時產(chǎn)生該服務(wù)。請注意自動服務(wù)在任何使用者登入機器前即已執(zhí)行。事實上,許多執(zhí)行Windows的設(shè)定只執(zhí)行服務(wù)—即沒有任何采互動式的登入情形。例如,某機器執(zhí)行Windows與服務(wù)器服務(wù),并允許一個在網(wǎng)路上的客戶端機器存取子目錄、文件以及打印機。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 手動 </B></FONT>一個設(shè)定為手動的服務(wù)即告訴SCM不要去啟動該服務(wù)。管理者可以使用SCP以手動的方式啟動一個服務(wù)。一個手動的服務(wù)也可以依據(jù)其他已啟動的服務(wù)來啟動。我們會在下一章說明依存關(guān)系的內(nèi)容。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 停用 </B></FONT>一個停用的服務(wù)即告訴SCM在任何情況下皆不要啟動服務(wù)。當您手動地為您的機器指定一個IP位址,而非讓它動態(tài)地從DHCP
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -