4.1 服务控制程序.htm

来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 628 行 · 第 1/5 页

HTM
628
字号
            <DIV align=center>[字体: <INPUT title=把正文字体缩小 style="HEIGHT: 16px" onclick="fontSize('m','ArticleBody')" type=button value=小> 
<INPUT title=把正文字体扩大 style="HEIGHT: 16px" onclick="fontSize('b','ArticleBody')" type=button value=大> 
<INPUT title=转为简体中文模式 style="HEIGHT: 16px" onclick="bodytojt('ArticleBody')" type=button value=简> 
<INPUT title=转为繁体中文模式 style="HEIGHT: 16px" onclick="bodytoft('ArticleBody')" type=button value=繁> 
            <A href="javascript:fontColor('ArticleBody')"><IMG alt=字体颜色 
            src="4.1 服务控制程序.files/fgcolor.gif" align=absMiddle 
            border=0></A>]</DIV></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=5 cellPadding=0 width="100%" align=center border=0>
        <TBODY>
        <TR>
          <TD vAlign=top>
            <TABLE cellSpacing=0 cellPadding=10 align=left border=0>
              <TBODY>
              <TR>
                <TD></TD></TR></TBODY></TABLE>
            <DIV class=content id=ArticleBody 
            style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
            <P class=content></P>
            <DIV style="WIDTH: 650px">
            <P align=center><B><FONT color=#3e80d7 size=5><SPAN 
            style="BACKGROUND-COLOR: #d7d7d7">4. 服务控制程序</SPAN></FONT></B></P>
            <DIV language=javascript id=tab1 
            style="MARGIN-LEFT: 20px; LINE-HEIGHT: 25px" 
            ondragover="return tab1_ondragover()"><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>就像您在第叁章所学的,一个服务控制程序(Service Control 
            Program,SCP)即是一个与执行在本端机器或远端机器之服务控制管理员(Service Control 
            Manager,SCM)通讯的应用程序。我通常会认为一个SCP即是一个控制服务的启动、停止、暂停或继续执行之应用程序。然而,一个SCP可以做到更多:它可以经由增加服务、移除服务与列举已安装服务来操作一个SCM的资料库。SCP也可以改变一个服务的设定内容。本章将会检查SCP与SCM沟通的各种的方式。请注意,SCM也能用来启动与停止一个设备驱动程序。本章会讨论到许多应用在服务与设备驱动程序二者上的函数,不过主要还是会集中在服务上,并且避免提到任何设备驱动程序的应用内容。</FONT> 

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>当您编写了一个服务时,同时也会建立一个应用程序以让管理员用来控制该服务。这个管理用的应用程序应该经由使用在本章中所提之各种函数来控制服务。这个应用程序也应该帮助管理者处理其他方面的服务,例如设定它(在第五章中叙述)与在Active 
            Directory中发布它。在观念上,此管理应用程序实现了一个像在Microsoft Management 
            Console(MMC)中的嵌入式管理单元或是一个以网路为基础的主控台。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>与一个机器的SCM通讯之第一个步骤是呼叫OpenSCManager:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">SC_HANDLE OpenSCManager( <BR> PCTSTR pszMachineName, <BR> PCTSTR pszDatabaseName, <BR> DWORD dwDesiredAccess);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个函数建立了一个与机器上之SCM通讯的通道,它经由pszMachineName参数指定,并传递NULL去开启在本端机器上的SCM。pszDatabaseName参数会确认应该开始哪一个资料库;您应该只是传递SERVICES_ACTIVE_DATABASE或NULL二者之一给此参数。dwDesiredAccess参数告诉函数您想要处理的SCM资料库。表4-1说明了有哪些存取权限可供使用。</FONT></P>
            <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">&nbsp;表4-1&nbsp;</B></FONT>用来指定存取SCM之OpenSCManager的dwDesiredAccess参数存取权限值</FONT></TD></TR></TBODY></TABLE></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=1>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>存取权限</FONT> </TH>
                <TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>说明</FONT></TH></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SC_MANAGER_ALL_ACCESS</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>除了STANDARD_RIGHTS_REQUIRED外,还包括了所有列在本表中的存取类型。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SC_MANAGER_CONNECT</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>允许连接至SCM。即使没有明白指定,然而这个存取经常是被隐含在内的。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SC_MANAGER_CREATE_ SERVICE</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>呼叫CreateService,以将一个服务加入SCM资料库中。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SC_MANAGER_ENUMERATE_SERVICE</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>呼叫EnumServicesStatus,以取得在SCM资料库中的服务清单与每一个服务的状态。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SC_MANAGER_LOCK</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>呼叫LockServiceDatabase,以停止从SCM启动的任何更多的服务。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SC_MANAGER_QUERY_ LOCK_STATUS</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>呼叫QueryServiceLockStatus,以找出哪一些使用者被锁定在SCM资料库中。</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>Windows提供了下列所示之预设存取,以使SCM变得较安全:</FONT></P><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
            <UL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px">管理者对SCM拥有完全的存取权。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI 
              style="LINE-HEIGHT: 25px">本机与Everyone拥有对SCM之SC_MANAGER_CONNECT、SC_MANAGER_ENUMERATE_SERVICE与SC_MANAGER_QUERY_ 
              LOCK_STATUS的存取权。<BR style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>OpenSCManager回传了一个SC_HANDLE让您将它传递至另一个函数中,以便您可以操作SCM的资料库。当您完成了对SCM资料库的存取时,您必须将它传递给CloseServiceHandle,以关闭此handle:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL CloseServiceHandle(SC_HANDLE hSCManager);</PRE></FONT></DIV><A 
            style="LINE-HEIGHT: 25px" name=204001>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">增加一个服务至SCM资料库<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>大部份要操作SCM资料库的原因之一即是增加一个服务。为了要增加一个服务,您必须呼叫OpenSCManager,并指定SC_MANAGER_CREATE_SERVICE之存取,然后再呼叫CreateService:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">SC_HANDLE CreateService( <BR> SC_HANDLE hSCManager, <BR> PCTSTR pszServiceName,&nbsp;&nbsp;//内部的、计划性的字串名称 <BR> PCTSTR pszDisplayName, <BR> DWORD dwDesiredAccess, <BR> DWORD dwServiceType, <BR> DWORD dwStartType, <BR> DWORD dwErrorControl, <BR> PCTSTR pszPathName, <BR> PCTSTR pszLoadOrderGroup, <BR> PDWORD pdwTagId,&nbsp;&nbsp; // 若为服务的话,通常为0 <BR> PCTSTR pszDependencies, // 使0终止的字串增加一倍 <BR> PCTSTR pszUserName, <BR> PCTSTR pszUserPswd);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>如您所见,CreateService需要相当多的参数(正确数目为13个)。hSCManager参数为由OpenSCManager回传的handle。接下来的二个参数pszServiceName和pszDisplayName指示了服务的名称。服务拥有一个内部的名称供程序设计者使用,以及一个给使用者看的显示名称。经由pszServiceName可以确定内部名称,它被SCM用来储存在登录内部的服务资讯。举例来说,Logical 
            Disk Manager服务拥有一个内部名称「dmserver」,而且它的服务资讯可以在以下所示的登录机码中找到:</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\dmserver</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>CreateService的dwDesiredAccess参数是有用的,因为它会告诉SCM在CreateService返回一个handle给它后,您打算如何处理刚被安装的服务(所以您可以正确的操作该服务)。如果您只安装了一个服务并且在它被安装后不打算操作它,那么只需简单地传递0给dwDesiredAccess,然后立即关闭经由呼叫CloseServiceHandle而被CreateService回传的handle即可。表4-2中显示了当您使用CreateService时可指定给dwDesiredAccess的存取权限。</FONT></P>
            <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">&nbsp;表4-2&nbsp;</B></FONT>CreateService的dwDesiredAccess参数的存取权限值,它可用来指定被增加至SCM资料库的服务之存取动作</FONT></TD></TR></TBODY></TABLE></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=1>
              <TBODY style="LINE-HEIGHT: 25px">

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?