工作原因,需要了解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——删除服务