一、相关结构体
1、SERVICE_STATUS结构
定义了服务的运行状态/服务类型/接受的控制形式以及指定错误代码等
1 typedef struct _SERVICE_STATUS { 2 DWORD dwServiceType; //服务类型 3 DWORD dwCurrentState; //当前服务运行状态 4 DWORD dwControlsAccepted; //接受控制的类型,注册服务时。此参数默认设置0 5 DWORD dwWin32ExitCode; //指定当服务【开始】/【停止】的退出码,默认0 6 DWORD dwServiceSpecificExitCode; 默认为0,指定当服务运行或停止错误时的代码,参数会忽略dwWin2ExitCode,除非dwWin2ExitCode指定为ERROR_SERVICE_SPECIFIC_ERROR, 7 DWORD dwCheckPoint; //默认设置0 8 DWORD dwWaitHint; //默认设置0 9 } SERVICE_STATUS, *LPSERVICE_STATUS;
2、_QUERY_SERVICE_CONFIG 结构
1 typedef struct _QUERY_SERVICE_CONFIG { 2 3 DWORD dwServiceType; 4 DWORD dwStartType; 5 DWORD dwErrorControl; 6 LPTSTR lpBinaryPathName; 7 LPTSTR lpLoadOrderGroup; 8 DWORD dwTagId; 9 LPTSTR lpDependencies; 10 LPTSTR lpServiceStartName; 11 LPTSTR lpDisplayName; 12 } QUERY_SERVICE_CONFIG, *LPQUERY_SERVICE_CONFIG;
QUERY_SERVICE_CONFIG 和 SERVICE_STATUS 的结构参数类似。
3、_ENUM_SERVICE_STATUS 结构
1 typedef struct _ENUM_SERVICE_STATUS { 2 LPTSTR lpServiceName; 3 LPTSTR lpDisplayName; 4 SERVICE_STATUS ServiceStatus; 5 } ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;
ENUM_SERVICE_STATUS 包含服务的名字,显示名。
二、函数
1、OpenSCManager
打开服务器控制管理器
1 SC_HANDLE OpenSCManager( 2 LPCTSTR lpMachineName, // 指定计算机的名字,如果为NULL,默认为local,如果是网络路径 格式需为已 "\\" 拼接的路径 3 LPCTSTR lpDatabaseName, // 指定打开的数据库名字,如果为NULL,打开默认的default 服务数据库 4 DWORD dwDesiredAccess // 指定访问的方式 5 );
返回值:当函数调用成功,返回已打开的(SC_HANDLE)句柄
2、CreateService
用于创建一个服务
1 SC_HANDLE CreateService( 2 SC_HANDLE hSCManager, // OpenSCManager打开的句柄 3 LPCTSTR lpServiceName, // 指定注册服务的名字 4 LPCTSTR lpDisplayName, // 指定注册服务显示的名字 5 DWORD dwDesiredAccess, // 指定创建服务所支持的访问控制 6 DWORD dwServiceType, // 指定创建的服务的类型 7 DWORD dwStartType, // 指定服务启动的类型 8 DWORD dwErrorControl, // 指定发生错误时的错误处理方式 9 LPCTSTR lpBinaryPathName, // 指定程序的路径 10 LPCTSTR lpLoadOrderGroup, // 指定服务所属组,为NULL则不为任何组 11 LPDWORD lpdwTagId, // 当没有所属组,此值为NULL 12 LPCTSTR lpDependencies, // 如果没有依赖项,此值为NULL 13 LPCTSTR lpServiceStartName, // 指定为NULL,以localSystem账户启动 14 LPCTSTR lpPassword // 当lpServiceStartName 不为NULL,需指定此参数。此参数指定lpServiceStartName的密码 15 );
返回值:
如果函数成功,返回一个SC_HANDLE的实例句柄。
如果函数失败,返回NULL, 调用GetLastError 获取错误代码。
3、EnumServicesStatus
枚举当前已注册的所有服务,函数可以一次获取所有服务的信息,所以接收体需要足够大。
1 BOOL EnumServicesStatus( 2 SC_HANDLE hSCManager, //打开的句柄 3 DWORD dwServiceType, // 要枚举的服务类型 【SERVICE_WIN32 / SERVICE_DRIVER】 4 DWORD dwServiceState, // 要枚举的状态 5 LPENUM_SERVICE_STATUS lpServices, //out:ENUM_SERVICE_STATUS 结构的输出参数,a struct = a service info 6 DWORD cbBufSize, // 指定lpServices的大小,以字节为单位 7 LPDWORD pcbBytesNeeded, // out: 接收实际需要的大小 8 LPDWORD lpServicesReturned, // out: 接收服务的数量 9 LPDWORD lpResumeHandle // 函数初次调用此参数必须为0,当函数调用成功。此参数为0. 当函数返回为0,GetLastError == ERROR_MORE_DATA 表示指向下一个服务节点的地址以获取更多附加数据。 10 );
返回值:
函数调用成功返回 nonzero.
函数调用失败返回zero
4、OpenService
打开指定的服务
1 SC_HANDLE OpenService( 2 SC_HANDLE hSCManager, // 句柄 3 LPCTSTR lpServiceName, // 要打开的服务名 4 DWORD dwDesiredAccess // 打开的方式 5 );
返回值:
调用成功返回打开的服务的句柄,
调用失败返回NULL。
5、QueryServiceConfig
查询服务的详细信息
1 BOOL QueryServiceConfig( 2 SC_HANDLE hService, // 打开服务的句柄 3 LPQUERY_SERVICE_CONFIG lpServiceConfig, // out: 接收服务信息的结构 【QUERY_SERVICE_CONFIG】 4 DWORD cbBufSize, // 指定 lpServiceConfig的大小,以字节为单位 5 LPDWORD pcbBytesNeeded // out: 实际接收的字节数 6 );
返回值:
调用成功返回nonzero,
调用失败返回zero.
6、QueryServiceConfig2
查询服务的information
1 BOOL QueryServiceConfig( 2 SC_HANDLE hService, // 打开服务的句柄 3 DWORD dwInfoLevel, // 等级 4 LPBYTE lpBuffer, // out: 接收服务信息的结构 【QUERY_SERVICE_CONFIG】 5 DWORD cbBufSize, // 指定lpBuffer的大小,以字节为单位 6 LPDWORD pcbBytesNeeded // out: 实际接收的字节数 7 );
返回值:
调用成功返回nonzero,
调用失败返回zero.
7、QueryServiceStatus
查询服务的运行状态
1 BOOL QueryServiceStatus( 2 SC_HANDLE hService, // 句柄 3 LPSERVICE_STATUS lpServiceStatus // out: 一个SERVICE_STATUS 结构的指针,接收服务状态 4 );
返回值:
调用成功返回nonzero,
调用失败返回zero.
8、ControlService
控制服务的运行
1 BOOL ControlService( 2 SC_HANDLE hService, // 打开实例的句柄 3 DWORD dwControl, // 控制的标志 4 LPSERVICE_STATUS lpServiceStatus // out 一个service_status结构,接收服务的详细信息 5 );
返回值:
调用成功返回nonzero,
调用失败返回zero.
9、StartService
启动一个已注册的服务
1 BOOL StartService( 2 SC_HANDLE hService, // 一个打开或创建的句柄 3 DWORD dwNumServiceArgs, // 服务参数,可为0 4 LPCTSTR *lpServiceArgVectors // 如果没有参数传递,可以为NULL 5 );
返回值:
调用成功返回nonzero,
调用失败返回zero.
10、CloseServiceHandle
关闭一个打开的服务句柄
1 BOOL CloseServiceHandle( 2 SC_HANDLE hSCObject // 句柄 3 );