2008年5月16日星期五

理解windows服务架构(译自windows TechNet)

(原文地址 http://technet.microsoft.com/en-us/library/aa998749(EXCHG.65).aspx)
windows服务,也称service application,是一些不管用户是否登录都在windows系统上运行的程序。一个windows服务包括一个可执行文件、一个存放application组件的目录和定义服务参数的注册表设置。


windows服务实现了一个统一的接口,SCM可以用该接口控制服务。一个windows服务可以在系统启动的时候自动运行,也可以通过service control program手动运行。service control program是通过SCM功能来控制服务的应用程序。service control program包括services.msc,以及命令行工具net.exe和sc.exe。

SCM进程是一个rpc server service。rpc使service control program和SCM进行本地通信,或通过网络通信来控制远程机器的服务。

SCM的职责:SCM,即service controller,是一个通用的windows进程,它执行各种与服务相关的任务。

一、护已安装服务的数据库SCM维护了一个已安装服务的数据库,包括一个所有服务和保证windows正常启动所必须加载的设备驱动的列表。SCM在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 维护该数据库,它为每个安装的服务和驱动创建了key,key的名字对应服务被服务配置程序安装时指定的名字,服务的名字最长是256个字符。
在services.msc看到的服务名字是display name,由注册表该服务的key下的DisplayName value指定。

二、锁定和解锁services数据库当SCM为了顺序访问配置信息进行初始化的时候,SCM必须锁定services数据库。例如,在一个服务启动之前SCM会锁定数据库,所以当服务启动的时候配置信息不能被改变。启动完毕后,SCM释放锁。重新配置一个服务,服务配置程序(service configuration program)必须向SCM申请锁,并在配置完毕之后解除锁。sc querylock可以查看services数据库是否被锁。

三、枚举安装的服务
SCM从services数据库读取每个key,为每个服务创建一个service record。一个完整的service record包括服务名、启动类型、服务状态(当前服务的状态和可接受的控制码),以及一个指向依赖表的指针。SCM通过service record中的当前状态和依赖关系决定何种动作对该服务有效。例如如果B的运行依赖于A,而B正在运行,那么此时不能停止服务A。

四、启动、停止、暂停和恢复服务
为执行如启动或停止一个服务的常规任务,SCM与它控制下的服务通信。SCM能够在系统启动时自动运行一项服务,也可以手动按需启动一项服务。如果一项自动启动的服务依赖于一项按需启动的服务,按需启动的服务也将自动启动。SCM能判定服务是否被disabled,如果一项服务被disable,依赖于它的自动或手动启动的服务都将不能运行。依赖关系在你准备disable一项服务时显得尤为重要,你不能disable关键服务。操作系统可能为此而不能启动,因为被disabled的服务阻止所有依赖于它的服务的启动,此时,你必须重新操作系统,以“最后一次正确配置”进入系统。windows在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001存储最后一次正确的配置,当每次成功启动操作系统,该key会更新。如果你以不正确的配置进入windows,你将不正确的配置apply到“最后一次正确配置”。

服务的启动类型:
START_TYPE:
0 BOOT_START
1 SYSTEM_START
2 AUTO_START
3 DEMAND_START
4 DISABLED

sc qc ServiceName 查询一个服务的启动类型、依赖等信息
sc start ServiceName 启动一项服务
net start ServiceName 启动一项服务

一项服务启动的顺序:
1. 获取services数据库中的账户信息一个服务账户的username和password在服务被安装的时候指定。SCM将username存储在value ObjectName中(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\)。password在LSA(Local Security Authority)的秘密部分。账户信息可以通过services.msc在log on面板更改。LocalSystem是一个预定义的本地账户,在本地计算机拥有很高权限。该账户只对系统进程可用。
2. 登录服务账户windows每个活动进程都有一个id,service也不例外。启动一个服务的时候,SCM从services数据库获取账户信息,并且登录windows。在本地计算机,SCM用来登录的账户必须有“Log on as a service”的权限。LocalSystem缺省有“Log on as a service”权限,因为该账户对所有系统资源有访问权限。
3. 创建挂起状态的服务SCM开启挂起状态的新服务,因为只有当SCM向新进程添加必要的安全信息后服务才起作用。
4. 向进程分配access tokenwindows执行的每个进程都需要一个access token,即logon token。access token是描述该服务安全上下文的数据结构。access token中的信息包括id和服务用来和操作系统交互的服务账户的权限。
5. 允许进程执行完成登录过程和分配access token后,SCM允许service运行,履行功能。

停止一项服务的步骤
1. SCM收到服务结束的请求service control program可以向SCM发送“SERVICE_CONTROL_STOP”来结束一个服务。
2. SCM检查服务依赖性如果SCM检测到其他正在运行的服务依赖于要被停止的服务,SCM向service control program返回error code。在触发停止过程前,service control program必须枚举并停止所有依赖特定服务的服务。
3. SCM向该服务转发停止请求如果检测没有依赖的活动服务,SCM向特定服务转发停止请求,该服务必须立即释放给他分配的资源并关闭。

五、维护正在运行服务的状态信息
当一个服务在运行时,它向SCM进程发送状态通知。SCM为每个服务在service record维护该状态信息。SCM跟踪该信息,使其不至于发出与该服务当前状态不符的控制请求。

服务状态信息包括:
服务类型:file system driver、device driver、windows service、是运行自己的进程还是和别的服务共享一个进程。在微软exchange中,smtp和iis共享一个进程。
当前状态:开始、运行、暂停、停止、没运行
可接受的控制码:根据当前状态决定
windows exit code:当一项服务在启动或停止时发生错误用该code来报告错误。为了返回有关该服务的错误code,该值必须设为“ERROR_SERVICE_SPECIFIC_ERROR”来指示在service exit code还有进一步的信息。如果正常启动或停止,该服务将该code设为“NO_ERROR”
service exit code:当一项服务在启动或停止时发生错误用该code来报告错误。除非windows exit code设为“ERROR_SERVICE_SPECIFIC_ERROR”,否则该值被忽略。
wait hint:服务使用该值报告一个operation可能需要的时间。
checkpoint:在一个长时间的启动、停止、暂停,或继续操作中,服务使用该值定期报告进度。

一项服务以LocalSystem帐户运行
1. 不需要另外的服务帐户和变更password。NT AUTHORITY\LocalSystem总是存在,以一个随机16进制数作为密码,该password每七天自动变更一次。
2. 完全控制所有的本地资源。
3. LocalSystem仅仅允许访问本地资源。如果一个服务以LocalSystem帐户运行,它只能够访问本地资源,除非使用另外一个帐户进行网络访问。以LocalSystem帐户运行的服务一般用NT AUTHORITY\NetworkService进行网络访问,该帐户没有密码。

标签:


评论: 发表评论

订阅 博文评论 [Atom]





<< 主页

This page is powered by Blogger. Isn't yours?

订阅 博文 [Atom]