|
谈谈WIN2K的服务
全文下载地址:
http://www.dimcax.com/resource/programming/WIN2KServer.pdf
I、摘要
II、关于WIN2K的服务
III、服务的启动和关闭
IV、服务的编程
V、关于服务的安全
VI、服务的管理
VII、结尾
I、摘要
WIN NT下的服务就类似*NIX下的守护进程一样,而且现在越来越多的软件开始设计成服务的形式。从XP推出之后,通过服务来实现多用户切换等就显得很有作用了。从安全角度来看待WIN服务的话,有很多的话题,比如运行的权限、运行的时间等等。本文主要介绍WIN服务的部分内容。
II、关于WIN2K的服务
WIN32服务由三部分组成:服务应用程序、服务控制程序(SCP)和服务控制管理器(SCM)。
一、服务控制管理器服务控制管理器(Service Control Manager):在系统启动的时候运行,是WIN系统的一部分,它是一个远程过程调用(RPC)服务器。它也是WIN服务系统的核心。
SCM主要负责:
·维护安装的服务数据库 ·在系统启动或者有命令的时候开始服务和驱动服务 ·枚举安装的服务和驱动 ·维护运行着的服务和驱动的状态 ·传输控制请求去运行服务 ·锁定和解锁服务数据库 SCM维护着注册表中的服务数据库,位于:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services。其下的子键就是安装的服务和驱动服务。每个子键的名称就是服务名,当安装的时候由服务安全程序的 CreateService 函数指定。当系统安装的时候,最初的数据库就被创建。这个数据库包含系统启动时候的设备驱动。数据库中的每个服务和驱动的信息包括:
·服务类型。服务启动时,是独自运行还是同其他服务共享运行,是核心驱动还是文件系统驱动?
·启动类型。服务或者驱动服务是在系统启动时自动启动,还是是由SCM来接受控制请求来启动?启动类型也表明服务是否被禁止。
·错误控制等级。指明如果服务或者驱动服务启动失败的错误处理。
·执行文件的全路径。
·附加依赖信息决定启动的正确顺序。对于服务,包括在服务启动之前SCM需要先启动的指定服务,服务所属加载顺序组的名称,服务在组中启动顺序的标志符。对于驱动,包括驱动启动前需要启动的指定驱动。
·对于服务,还有附加的帐号名称和密码。如果没有指定帐号,服务就使用LocalSystem帐号。
·对于驱动,附加驱动对象名称,用于I/0系统加载设备驱动。如果没有指明对象名,I/O系统在驱动服务名称基础上创建一个默认的名称。
二、服务控制程序服务控制程序(SCP)则是控制服务应用程序的功能块,也是服务应用程序同服务管理器(SCM)之间的桥梁。
服务控制程序可以完成这些动作:
·如果服务启动类型为SERVICE_DEMAND_START,那么服务通过程序来启动服务
·发送控制请求给运行着的服务
·查询运行着的服务的当前状态这些动作要求打开一个服务对象的句柄。
·服务启动要启动一个服务,服务控制程序使用StartService 函数。如果数据库被锁定,那么StartService函数会失败。如果遇到这种情况,那么服务控制程序需要等待,并重新调用StartService。可以通过QueryServiceLockStatus来查询服务数据库的状态。当通过程序开始一个服务的时候,可以通过StartService函数来指定传递给服务ServiceMain 函数的参数。当创建一个新的线程去执行ServiceMain后,StartService就返回了。服务控制程序可以通过QueryServiceStatus 函数来查询被启动服务的状态。在SERVICE_STATUS结构初始化中,dwCurrentState应该是SERVICE_START_PENDING,而dwWaitHint则是一个毫秒的时间间隔,表示服务控制程序在调用QueryServiceStatus应该等待的时间。当初始化完成,服务就会改变服务的状态dwCurrentState 为SERVICE_RUNNING。如果服务在预定时间(比如80秒)加最后的等待时间内没有改变它的状态,服务控制管理器将此服务界定为已经停止响应,并记录此日志和停止服务。如果程序在启动驱动服务,StartService会在设备驱动初始化完成后返回。 |
|