windows服务程序编写笔记

preview
需积分: 0 1 下载量 27 浏览量 更新于2013-10-29 收藏 20KB DOC 举报
### Windows服务程序编写知识点 #### 一、服务的基础知识 **1. 什么是服务?它的特征是什么?** - **定义**: 服务是一种特殊的Win32应用程序,它可以在后台运行而无需用户界面。这类程序通常执行关键任务,如系统管理、硬件监控等。 - **特性**: - **后台运行**: 服务不依赖于用户交互即可运行,这意味着它们可以在系统启动时自动启动并在系统关闭时自动关闭。 - **系统优待**: 服务通常具有较高的优先级,以便它们可以高效地执行关键任务。 - **远程管理**: 服务可以通过网络进行配置和管理,这使得管理员可以从远程位置控制服务。 #### 二、服务的安全性 **2. 服务的安全性** - **上下文**: 当一个进程被创建时,它将在特定用户的上下文中运行。这意味着该进程将拥有该用户的所有权限。 - **权限管理**: 由于服务也是一个Win32应用程序,因此它也需要在一个用户的上下文中运行。为了确保安全性,通常服务会使用专用账户或限制性更强的账户来运行。 - **安全性考量**: 开发者在设计服务时需要考虑如何最小化服务所需的权限,以减少潜在的安全风险。 #### 三、服务的三个组成部分 **3. 服务的三个组成部分** - **ServiceControlManager (SCM)**: SCM 是 Windows 系统中的核心组件,用于管理和控制服务。SCM 存在于 Service.exe 进程中,随着操作系统的启动和关闭而启动和关闭。 - **服务本身**: 服务包含特殊的代码,使其能够接收来自 SCM 的信号和命令,并向 SCM 报告其状态。 - **ServiceControl Dispatcher (SCP)**: SCP 是一个带有用户界面的应用程序,允许用户启动、停止、暂停和恢复服务。开发者可能需要编写自己的 SCP 应用来管理服务。 #### 四、服务的设计与实现 **4. 怎样开始设计服务** - **入口点函数**: - `main()` 或 `WinMain()` 函数是服务程序的起点,负责初始化整个进程。 - **ServiceMain**: - 此函数由操作系统调用,是服务的主要入口点。 - 函数原型如下: ```c++ VOID WINAPI ServiceMain( DWORD dwArgc, // 参数个数 LPTSTR *lpszArgv // 参数列表 ); ``` - **CtrlHandler**: - 这是一个必须存在的函数,用于响应来自 SCM 的控制命令。 - 函数原型如下: ```c++ VOID WINAPI CtrlHandler( DWORD fdwControl // 控制命令 ); ``` #### 五、服务的深入讨论 **5. 对服务的深入讨论之上** - **初始化 SERVICE_TABLE_ENTRY 结构数组**: - 在 ServiceMain 函数中,需要初始化一个 `SERVICE_TABLE_ENTRY` 数组,该数组包含了服务名称和服务主函数的映射关系。 - 示例代码如下: ```c++ SERVICE_TABLE_ENTRY service_table_entry[] = { { "MyFTPd", FtpdMain }, { "MyHttpd", Httpserv }, { NULL, NULL } }; ``` - 数组中的最后一个元素必须以 `{ NULL, NULL }` 结束。 - **调用 StartServiceCtrlDispatcher**: - 使用 `StartServiceCtrlDispatcher` 函数启动服务。 - 函数原型如下: ```c++ BOOL StartServiceCtrlDispatcher( LPSERVICE_TABLE_ENTRY lpServiceStartTable ); ``` - 此函数将遍历传入的 `SERVICE_TABLE_ENTRY` 数组,并为每个非空条目创建一个新线程,这些线程将执行相应的 `ServiceMain` 函数。 通过以上知识点的学习,开发者可以深入了解 Windows 服务的开发流程和技术细节,从而更好地设计和实现可靠的服务程序。