Windows系统编程---第9章.ppt
《Windows系统编程---第9章.ppt》由会员分享,可在线阅读,更多相关《Windows系统编程---第9章.ppt(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、WindowsWindows系统编程实用教程系统编程实用教程系统编程实用教程系统编程实用教程授课教师:授课教师:职务:职务:第第9章章 Windows服务编程服务编程课程描述课程描述WindowsWindowsWindowsWindows服务是长服务是长服务是长服务是长期在后台运行、不期在后台运行、不期在后台运行、不期在后台运行、不与用户进行交互的与用户进行交互的与用户进行交互的与用户进行交互的程序。在程序。在程序。在程序。在C/SC/SC/SC/S结构结构结构结构的应用程序中通常的应用程序中通常的应用程序中通常的应用程序中通常可以服务的形式开可以服务的形式开可以服务的形式开可以服务的形式开发
2、服务器程序。有发服务器程序。有发服务器程序。有发服务器程序。有的应用程序中还需的应用程序中还需的应用程序中还需的应用程序中还需要检测和控制服务要检测和控制服务要检测和控制服务要检测和控制服务的状态。本章将介的状态。本章将介的状态。本章将介的状态。本章将介绍绍绍绍WindowsWindowsWindowsWindows服务编服务编服务编服务编程的基本方法。程的基本方法。程的基本方法。程的基本方法。本章知识点本章知识点9.1 Windows9.1 Windows服务的概念和管理服务的概念和管理9.2 Windows9.2 Windows服务编程服务编程9.3 9.3 开发开发WindowsWind
3、ows服务程序服务程序9.4 9.4 增加和使用组件增加和使用组件9.1 Windows服务的概念和管理服务的概念和管理9.1.1 9.1.1 管理管理WindowsWindows服务服务9.1.2 9.1.2 服务控制器服务控制器9.1.1 管理管理Windows服务服务服务的属性对话框服务的属性对话框 命令行工具命令行工具sc.exesc command service name .sc command service name .参数说明如下:参数说明如下:p,指定要连接的计算机,格式为,指定要连接的计算机,格式为“”。pcommandcommand,指定对服务进行的操作,具体如下:,指
4、定对服务进行的操作,具体如下:query,查询服务的状态或枚举服务类型的状态。queryex,查询服务的扩展状态或枚举服务类型的状态。start,启动服务。pause,向服务发送 PAUSE 控制请求。interrogat,-向服务发送 INTERROGATE 控制请求。continue,向服务发送 CONTINUE 控制请求。stop,向服务发送 STOP 请求。config,永久更改服务的配置。description,更改服务的描述。failure,更改服务失败时所进行的操作sidtype,更改服务的服务 SID 类型。qc,查询服务的配置信息。qdescription,查询服务的描述。接
5、上接上qfailure,查询服务失败时所进行的操作qsidtype,查询服务的服务 SID 类型。delete,从注册表中删除服务。create,创建服务(将其添加到注册表)control,向服务发送控制。sdshow,显示服务的安全描述符。sdset,设置服务的安全描述符。showsid,显示与任意名称相对应的服务 SID。GetDisplayName,获取服务的显示名称。GetKeyName,获取服务的键名。EnumDepend,枚举服务的依存关系。pservice nameservice name,指定要操作的服务名。,指定要操作的服务名。【例【例9.1】p使用使用scsc命令查询服务命
6、令查询服务MySQLMySQL的状态,命令如下:的状态,命令如下:sc query MySQLsc query MySQL【例【例9.2】p使用使用scsc命令停止服务命令停止服务MySQLMySQL的状态,命令如下:的状态,命令如下:sc sc stopstop MySQL MySQL9.1.2 服务控制器服务控制器p服务控制器(服务控制器(Service Control Manager Service Control Manager,SCMSCM)是)是Windows NTWindows NT家族操作系统中的一个系统进程,它可以家族操作系统中的一个系统进程,它可以启动、停止启动、停止Win
7、dowsWindows服务,并与服务,并与WindowsWindows服务交流。服务交流。p服务控制器对应的可执行文件是服务控制器对应的可执行文件是%SystemRoot%services.exe%SystemRoot%services.exe,它以,它以WindowsWindows控制台程控制台程序的形式运行。序的形式运行。注册表中关于服务的内容注册表中关于服务的内容注册表中服务包含的键值注册表中服务包含的键值名称说明DisplayName服务的显示名称。如果没有指定,则使用键名作为服务的名称Group指定服务所属得为服务组。如果没有指定,则该服务不属于任何服务组ErrorControl指定
8、服务或设备驱动程序在加载和初始化时出现错误的处理方法。取值如下:0(忽略),忽略出现的错误,继续启动,不产生警告;1(正常),缺省值,继续启动,弹出一个警告消息框,并在系统日志中记录警告信息;2(严重),系统声明启动失败;3(紧急),系统声明启动失败,并停止启动过程,运行调试程序;ImagePath驱动程序或服务对应的可执行文件的位置ObjectName用于指定驱动程序对象的名称,用于加载驱动程序Start指定服务的启动方式。取值如下:0,由系统内核加载;1,由I/O管理器加载;2,由SCM加载;3,由用户手动启动Type指定服务的类型。9.2 Windows服务编程服务编程9.2.1 9.2
9、.1 与与SCMSCM建立连接建立连接9.2.2 9.2.2 创建服务创建服务9.2.3 9.2.3 打开服务打开服务9.2.4 9.2.4 枚举服务列表枚举服务列表9.2.5 9.2.5 启动服务启动服务9.2.6 9.2.6 停止服务停止服务9.2.7 9.2.7 查询服务的状态查询服务的状态9.2.8 9.2.8 修改修改服务的服务的配置参数配置参数9.2.1 与与SCM建立连接建立连接SC_HANDLE WINAPI OpenSCManager(SC_HANDLE WINAPI OpenSCManager(_in LPCTSTR lpMachineName,_in LPCTSTR lp
10、MachineName,/指定要连接的目标计算机,指定要连接的目标计算机,如果为如果为NULLNULL或空字符串,则连接到本地计算机或空字符串,则连接到本地计算机 _in LPCTSTR lpDatabaseName,_in LPCTSTR lpDatabaseName,/要连接的服务控制器名字,要连接的服务控制器名字,应使用应使用SERVICES_ACTIVE_DATABASESERVICES_ACTIVE_DATABASE。如果使用。如果使用NULLNULL,则表示连接的默认,则表示连接的默认服务控制器服务控制器 _in DWORD dwDesiredAccess _in DWORD dw
11、DesiredAccess/指定对服务控制器的访问指定对服务控制器的访问权限权限););9.2.2 创建服务创建服务SC_HANDLE WINAPI CreateService(SC_HANDLE WINAPI CreateService(_in SC_HANDLE hSCManager,_in SC_HANDLE hSCManager,_in LPCTSTR lpServiceName,_in LPCTSTR lpServiceName,_in LPCTSTR lpDisplayName,_in LPCTSTR lpDisplayName,_in DWORD dwDesiredAccess,
12、_in DWORD dwDesiredAccess,_in DWORD dwServiceType,_in DWORD dwServiceType,_in DWORD dwStartType,_in DWORD dwStartType,_in DWORD dwErrorControl,_in DWORD dwErrorControl,_in LPCTSTR lpBinaryPathName,_in LPCTSTR lpBinaryPathName,_in LPCTSTR lpLoadOrderGroup,_in LPCTSTR lpLoadOrderGroup,_out LPDWORD lpd
13、wTagId,_out LPDWORD lpdwTagId,_in LPCTSTR lpDependencies,_in LPCTSTR lpDependencies,_in LPCTSTR lpServiceStartName,_in LPCTSTR lpServiceStartName,_in LPCTSTR lpPassword _in LPCTSTR lpPassword););【例【例9.3】p编写程序,将其自身安装为编写程序,将其自身安装为WindowsWindows服务。自定义函数服务。自定义函数SvcInstall()SvcInstall()用于安装服务,代码如用于安装服务,代
14、码如下:下:#include stdafx.h#include stdafx.h#include#include#include#include#define SVCNAME TEXT(SvcName)#define SVCNAME TEXT(SvcName)VOID SvcInstall()VOID SvcInstall()SC_HANDLE schSCManager;SC_HANDLE schSCManager;SC_HANDLE schService;SC_HANDLE schService;TCHAR szPathMAX_PATH;TCHAR szPathMAX_PATH;/获取当前程
15、序的可执行文件的路径获取当前程序的可执行文件的路径 if(!GetModuleFileName(NULL,szPath,MAX_PATH)if(!GetModuleFileName(NULL,szPath,MAX_PATH)printf(Cannot install service(%d)n,GetLastError();printf(Cannot install service(%d)n,GetLastError();return;return;接上接上 /获取服务控制器数据库句柄获取服务控制器数据库句柄 schSCManager=OpenSCManager(schSCManager=Ope
16、nSCManager(NULL,/NULL,/本地计算机本地计算机 NULL,/NULL,/使用缺省的数据库使用缺省的数据库 SC_MANAGER_ALL_ACCESS);/SC_MANAGER_ALL_ACCESS);/使用全部访问权限使用全部访问权限 if(NULL=schSCManager)if(NULL=schSCManager)printf(OpenSCManager failed(%d)n,GetLastError();printf(OpenSCManager failed(%d)n,GetLastError();return;return;/安装服务安装服务 schService
17、=CreateService(schService=CreateService(schSCManager,/schSCManager,/服务控制器数据库句柄服务控制器数据库句柄 SVCNAME,/SVCNAME,/服务名服务名 SVCNAME,/SVCNAME,/服务显示名服务显示名 接上接上SERVICE_ALL_ACCESS,/SERVICE_ALL_ACCESS,/使用全部访问权限使用全部访问权限 SERVICE_WIN32_OWN_PROCESS,/SERVICE_WIN32_OWN_PROCESS,/服务类型为在其自己的进程中运行的服务服务类型为在其自己的进程中运行的服务 SERVI
18、CE_DEMAND_START,/SERVICE_DEMAND_START,/启动类型启动类型 SERVICE_ERROR_NORMAL,/SERVICE_ERROR_NORMAL,/错误控制类型错误控制类型 szPath,/szPath,/服务可执行文件的路径服务可执行文件的路径 NULL,/NULL,/没有加载顺序组没有加载顺序组 NULL,/NULL,/没有标记标识符没有标记标识符 NULL,/NULL,/没有依赖关系没有依赖关系 NULL,/NULL,/使用使用LocalSystemLocalSystem账户运行服务账户运行服务 NULL);/NULL);/不需要指定密码不需要指定密码
19、 if(schService=NULL)if(schService=NULL)printf(CreateService failed(%d)n,GetLastError();printf(CreateService failed(%d)n,GetLastError();CloseServiceHandle(schSCManager);CloseServiceHandle(schSCManager);return;return;else printf(Service installed successfullyn);else printf(Service installed successful
20、lyn);/关闭句柄关闭句柄 CloseServiceHandle(schService);CloseServiceHandle(schService);CloseServiceHandle(schSCManager);CloseServiceHandle(schSCManager);主函数主函数_tmain()int _tmain(int argc,_TCHAR*argv)int _tmain(int argc,_TCHAR*argv)/如果带有一个命令行参数如果带有一个命令行参数-install-install,则安装服务,则安装服务if(argc=2&!strcmp(argv1,-ins
21、tall)if(argc=2&!strcmp(argv1,-install)SvcInstall();SvcInstall();/下面是服务的代码下面是服务的代码return 0;return 0;如果带有一个命令行参数如果带有一个命令行参数-install-install,则调用,则调用SvcInstall()SvcInstall()函数安函数安装服务。下面的代码可以设计服务的具体功能,本例中省略了装服务。下面的代码可以设计服务的具体功能,本例中省略了服务的具体功能。服务的具体功能。9.2.3 打开服务打开服务SC_HANDLE WINAPI OpenService(SC_HANDLE WI
22、NAPI OpenService(_in SC_HANDLE hSCManager,_in SC_HANDLE hSCManager,/调调用用OpenSCManager()OpenSCManager()函数返回的服务控制器句柄函数返回的服务控制器句柄 _in LPCTSTR lpServiceName,/_in LPCTSTR lpServiceName,/要要打开的服务名打开的服务名 _in DWORD dwDesiredAccess _in DWORD dwDesiredAccess/对服务的访问权限对服务的访问权限););CloseServiceHandle()函数函数p对服务执行完操
23、作之后,需要调用对服务执行完操作之后,需要调用CloseServiceHandleCloseServiceHandle()()函数关闭打开的服务句柄,函数原型如下:函数关闭打开的服务句柄,函数原型如下:BOOL WINAPI CloseServiceHandle(BOOL WINAPI CloseServiceHandle(_in SC_HANDLE hSCObject _in SC_HANDLE hSCObject/要要关闭的服务句柄关闭的服务句柄););9.2.4 枚举服务列表枚举服务列表BOOL WINAPI EnumServicesStatusEx(BOOL WINAPI EnumSe
24、rvicesStatusEx(_in SC_HANDLE hSCManager,_in SC_HANDLE hSCManager,_in SC_ENUM_TYPE InfoLevel,_in SC_ENUM_TYPE InfoLevel,_in DWORD dwServiceType,_in DWORD dwServiceType,_in DWORD dwServiceState,_in DWORD dwServiceState,_out LPBYTE lpServices,_out LPBYTE lpServices,_in DWORD cbBufSize,_in DWORD cbBufSi
25、ze,_out LPDWORD pcbBytesNeeded,_out LPDWORD pcbBytesNeeded,_out LPDWORD lpServicesReturned,_out LPDWORD lpServicesReturned,_in_out LPDWORD lpResumeHandle,_in_out LPDWORD lpResumeHandle,_in LPCTSTR pszGroupName _in LPCTSTR pszGroupName););【例【例9.4】编写程序,枚举并打印系统服务编写程序,枚举并打印系统服务。代码见书。代码见书。9.2.5 启动服务启动服务B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 系统 编程
限制150内