简单的介绍一下Windows服务。
Windows服务包括四大部分:
- 服务控制管理器(Service Control Manager)
- 服务控制程序(Service Control Program)
- 服务程序(Service Program)
- 服务配置程序(Service Configuration Program)
服务控制管理器 SCM
服务控制管理器在系统启动的早期由Winlogin进程启动,可执行文件名是“Admin$\System32\Services.exe”,它是系统中的RPC服务器,因此服务配置程序和服务控制程序可以在远程操纵服务。
它包括以下方面信息
- 已安装服务数据库:服务控制管理器在注册表中拥有一个已安装服务的数据库,它在服务控制管理器和程序添加、删除和配置服务程序时使用,在注册表中数据库的位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
它包括很多子键,每个子键的名字就代表一个对应的服务。数据库中包括服务类型(私有进程、共享进程)、启动类型(自动运行、有服务控制管理器启动、无效)、错误类型(忽略、常规错误、服务错误、关键错误)、执行文件路径、依赖信息项、可选用户名与密码。 - 自动启动服务:系统启动时,服务控制管理器启动所有“自启”服务和相关依赖服务。服务的加载顺序列表在注册表中的位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder
键值List中保存了表示服务组启动顺序信息。每一个服务组都是一个字符串,通过字符串在职中排列的先后顺序表示服务组被加载的先后顺序。
各服务启动顺序的信息在注册表中位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList
在系统成功引导后悔保留一份LKG(Last-Know-Good)的配置信息位于注册表的位置:HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services - 因要求而启动服务:可以使用“控制面板”中的“服务”来启动一项服务。服务控制程序也可以使用StartService来启动服务。服务控制管理器会进行下面的操纵:获取账户信息、登录服务项目、创建服务为悬挂状态、分配登录令牌给进程、允许进程执行
- 服务记录列表:每项服务在数据库中都包含了一下的内容:服务名称、开始类型、服务状态(类型、当前状态、接受控制代码、退出代码、等待提示)、依赖服务列表指针。
- 服务控制管理器句柄:服务控制管理器支持句柄类型访问:已安装服务数据库、服务程序、数据库的锁开状态。
服务控制程序 SCP
服务控制程序可以执行对服务程序的开启、控制和状态查询功能。
如果服务的开启类型为SERVICE_DEMAND_START,就可以用服务控制程序来开始一项服务。在开始服务的初始化阶段服务的当前状态为SERVICE_START_PENDING,而在初始化完成后的状态为SERVICE_RUNNING。
控制请求可以是系统默认的,也可以是用户自定义的。标准控制代码如下:停止服务(SERVICE_CONTROL_STOP)、暂停服务(SERVICE_CONTROL_PAUSE)、恢复已暂停服务(SERVICE_CONTROL_CONTINUE)、获得更新信息(SERVICE_CONTROL_INTERROGATE)。
服务程序
一个服务程序可能拥有一个或多个服务的执行代码。 我们可以创建类型为SERVICE_WIN32_OWN_PROCESS的只拥有一个服务的服务程序。而类型为SERVICE_WIN32_SHARE_PROCESS的服务程序却可以包含多个服务的执行代码。
服务配置程序
服务配置程序用以更改,查询已安装服务的信息。当然也可以通过注册表函数来访问相关资源,毕竟服务的相关信息就在注册表里。