工作原因,需要了解windows平台下的服务管理(service control manager)机制,记录此文作为总结

 

一、基本概念

1.服务控制管理器(service control manager,简称 scm):windowns下的一个核心服务进程services.exe,有wininit启动运行。这是windows系统的一个核心服务,如果该服务异常,会导致系统蓝屏

2.服务程序(service program):简称服务,指实现在windows服务接口的后台程序,它们一般可以在管理工具->服务 这个工具中看到。和一般linux的daemon程序类似,它们都在后台运行,一般不和用户交互,但不同的是,windows的服务必须实现一套服务标准接口,并接受scm的管理和控制。

3.服务配置程序(service configuration program):服务配置程序,通过查询、修改服务数据库,实现对服务的安装、卸载、配置等功能

4.服务控制程序(service control program):通过scm对服务进行启动、停止、状态查询等功能的一些工具,最常见的有管理工具下面的服务插件(snap in)、sc.exe程序

 

二、基本框架

整个windows的服务管理架构,主要由服务控制管理器、服务、服务控制程序三部分组成,其中服务控制管理器时整个框架的核心。其体系结构如下图所示:

服务管理体系架构图 服务管理体制_命名管道

 

整个框架是以scm为核心的,它负责其他服务的启动、监控,而业务控制、业务配置,也大多都需要通过scm来实现

业务的信息,保存在系统注册表中,scm启动时会从系统注册表中读取业务的信息,并启动所有配置为“自动”的服务,之后在启动“自动(延迟)”的服务

业务启动后,需要向scm报告业务状态,并接受scm发送的查询、停止命令

 

三、重要流程

1.scm的启动

scm的可执行程序时windows\system32目录下的services.exe,在系统启动阶段由wininit进程创建。

scm是系统的核心进程,如果该进程启动失败,会导致系统蓝屏

 

2.scm初始化

scm启动后,会执行下面的动作:

1)构建已安装服务的内部数据库:主要是从注册表中读取已有的配置

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List:读取以安装服务组(service group)的启动顺序
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:所有已安装服务的配置信息

2)根据服务组启动顺序、服务的依赖关系,确定好服务的启动顺序

3)创建命名管道\Pipe\Ntsvcs:这个命名管道主要用于scm于scp与scm之间进行通信

4)调用ScAutoStartServices函数,循环启动所有标识为“auto-start”的服务。对于每个服务,调用ScStartService函数

  • 调用CreateProcessAsUser函数创建服务进程(挂起状态)
  • 创建\Pipe\Net\NtControlPipeX命名管道(X是一个内部序号,每个服务加1)
  • 向服务发送“start”命令

5)调用ScInitDelayStart函数,启动标识为“Delayed auto-start”的服务,过程同上

 

3.服务进程

1)在主线程中调用StartServiceCtrlDispatcher函数,准备接受scm的控制指令

2)在收到scm发来的“start”指令时,创建服务线程:

  • 调用RegisterServiceCtrlHandler,注册该服务的指令处理函数
  • 调用SetServiceStatus或ReportSvcStatus向scm报告服务状态
  • 执行服务自己的专用代码

 

四、服务控制程序

常见的服务控制程序主要是两个:一个管理工具下的“服务”(也可以的运行-->services.msc),这个是一个图形交互界面,可以看到系统中现存的服务列表、服务状态等信息,也可以在该界面下启动或停止服务。另一个工具是一个命令行工具:sc.exe,该工具功能强大,可以创建服务、删除服务、配置服务、启动或停止服务等。下面主要介绍这个工具

1.sc.exe基本命令格式

sc [命令] [服务名] <选项1> <选项2> ...

2.常用命令

sc query——查询服务的状态,或枚举服务类型的状态

sc queryex——查询服务的扩展状态

sc start——启动服务

sc pause——暂停服务

sc stop——停止服务

sc config——配置服务

sc create——创建服务

sc delete——删除服务