c语言查看服务运行状态,C/C++ Windows API——关闭、启动、查询服务状态

// ServiceDemo.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

int main()

{

BOOL ret;

/*

_Must_inspect_result_ WINADVAPI SC_HANDLE WINAPI OpenSCManagerW(

_In_opt_ LPCWSTR lpMachineName,

_In_opt_ LPCWSTR lpDatabaseName,

_In_ DWORD dwDesiredAccess

);

dwDesiredAccess可以是如下值

#define SC_MANAGER_CONNECT 0x0001

#define SC_MANAGER_CREATE_SERVICE 0x0002

#define SC_MANAGER_ENUMERATE_SERVICE 0x0004

#define SC_MANAGER_LOCK 0x0008

#define SC_MANAGER_QUERY_LOCK_STATUS 0x0010

#define SC_MANAGER_MODIFY_BOOT_CONFIG 0x0020

#define SC_MANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \

SC_MANAGER_CONNECT | \

SC_MANAGER_CREATE_SERVICE | \

SC_MANAGER_ENUMERATE_SERVICE | \

SC_MANAGER_LOCK | \

SC_MANAGER_QUERY_LOCK_STATUS | \

SC_MANAGER_MODIFY_BOOT_CONFIG)

*/

LPCWSTR lpMachineName = NULL;

LPCWSTR lpDatabaseName = NULL;

DWORD dwSCManagerDesiredAccess = SC_MANAGER_ALL_ACCESS;

SC_HANDLE scHandle = OpenSCManager(lpMachineName, lpDatabaseName, dwSCManagerDesiredAccess);

if (scHandle == NULL) {

printf("OpenSCManager -> ret=0 -> fail(%ld)\n", GetLastError());

}

else {

printf("OpenSCManager -> succ\n");

/*

_Must_inspect_result_ WINADVAPI SC_HANDLE WINAPI OpenService(

_In_ SC_HANDLE hSCManager,

_In_ LPCTSTR lpServiceName,

_In_ DWORD dwDesiredAccess

);

#define SERVICE_QUERY_CONFIG 0x0001

#define SERVICE_CHANGE_CONFIG 0x0002

#define SERVICE_QUERY_STATUS 0x0004

#define SERVICE_ENUMERATE_DEPENDENTS 0x0008

#define SERVICE_START 0x0010

#define SERVICE_STOP 0x0020

#define SERVICE_PAUSE_CONTINUE 0x0040

#define SERVICE_INTERROGATE 0x0080

#define SERVICE_USER_DEFINED_CONTROL 0x0100

#define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \

SERVICE_QUERY_CONFIG | \

SERVICE_CHANGE_CONFIG | \

SERVICE_QUERY_STATUS | \

SERVICE_ENUMERATE_DEPENDENTS | \

SERVICE_START | \

SERVICE_STOP | \

SERVICE_PAUSE_CONTINUE | \

SERVICE_INTERROGATE | \

SERVICE_USER_DEFINED_CONTROL)

*/

//打印服务

LPCTSTR lpServiceName = _T("Spooler");

DWORD dwDesiredAccess = SERVICE_QUERY_STATUS | SERVICE_START | SERVICE_STOP;

SC_HANDLE serviceHandle = OpenService(scHandle, lpServiceName, dwDesiredAccess);

if (serviceHandle == NULL) {

printf("OpenService scHandle=%p, lpServiceName=%s -> ret=0 -> fail(%ld)\n", scHandle, lpServiceName, GetLastError());

}

else {

printf("OpenService scHandle=%p, lpServiceName=%s -> serviceHandle=%p\n", scHandle, lpServiceName, serviceHandle);

/*

WINADVAPI BOOL WINAPI StartServiceW(

_In_ SC_HANDLE hService,

_In_ DWORD dwNumServiceArgs,

_In_reads_opt_(dwNumServiceArgs)

LPCWSTR *lpServiceArgVectors

);

*/

ret = StartService(serviceHandle, NULL, NULL);

if (!ret) {

//〖1056〗-服务的实例已在运行中。

printf("StartService serviceHandle=%p -> fail(%ld)\n", serviceHandle, GetLastError());

} else {

printf("StartService serviceHandle=%p -> succ\n", serviceHandle);

/*

_Must_inspect_result_ WINADVAPI BOOL WINAPI QueryServiceStatus(

_In_ SC_HANDLE hService,

_Out_ LPSERVICE_STATUS lpServiceStatus

);

typedef struct _SERVICE_STATUS {

DWORD dwServiceType;

DWORD dwCurrentState;

DWORD dwControlsAccepted;

DWORD dwWin32ExitCode;

DWORD dwServiceSpecificExitCode;

DWORD dwCheckPoint;

DWORD dwWaitHint;

} SERVICE_STATUS, *LPSERVICE_STATUS;

dwServiceType可以是下列值

#define SERVICE_KERNEL_DRIVER 0x00000001

#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002

#define SERVICE_ADAPTER 0x00000004

#define SERVICE_RECOGNIZER_DRIVER 0x00000008

#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \

SERVICE_FILE_SYSTEM_DRIVER | \

SERVICE_RECOGNIZER_DRIVER)

#define SERVICE_WIN32_OWN_PROCESS 0x00000010

#define SERVICE_WIN32_SHARE_PROCESS 0x00000020

#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \

SERVICE_WIN32_SHARE_PROCESS)

#define SERVICE_INTERACTIVE_PROCESS 0x00000100

#define SERVICE_TYPE_ALL (SERVICE_WIN32 | \

SERVICE_ADAPTER | \

SERVICE_DRIVER | \

SERVICE_INTERACTIVE_PROCESS)

dwCurrentState可以是如下值

#define SERVICE_STOPPED 0x00000001

#define SERVICE_START_PENDING 0x00000002

#define SERVICE_STOP_PENDING 0x00000003

#define SERVICE_RUNNING 0x00000004

#define SERVICE_CONTINUE_PENDING 0x00000005

#define SERVICE_PAUSE_PENDING 0x00000006

#define SERVICE_PAUSED 0x00000007

*/

SERVICE_STATUS serviceStatus = { 0 };

do {

ret = QueryServiceStatus(serviceHandle, &serviceStatus);

//休眠(挂起线程),单位毫秒

Sleep(300);

} while (ret && serviceStatus.dwCurrentState != SERVICE_RUNNING);

}

/*

WINADVAPI BOOL WINAPI ControlService(

_In_ SC_HANDLE hService,

_In_ DWORD dwControl, //需要有SERVICE_USER_DEFINED_CONTROL权限。

_Out_ LPSERVICE_STATUS lpServiceStatus

);

dwControl可以取如下值

#define SERVICE_CONTROL_STOP 0x00000001

#define SERVICE_CONTROL_PAUSE 0x00000002

#define SERVICE_CONTROL_CONTINUE 0x00000003

#define SERVICE_CONTROL_INTERROGATE 0x00000004

#define SERVICE_CONTROL_SHUTDOWN 0x00000005

#define SERVICE_CONTROL_PARAMCHANGE 0x00000006

#define SERVICE_CONTROL_NETBINDADD 0x00000007

#define SERVICE_CONTROL_NETBINDREMOVE 0x00000008

#define SERVICE_CONTROL_NETBINDENABLE 0x00000009

#define SERVICE_CONTROL_NETBINDDISABLE 0x0000000A

#define SERVICE_CONTROL_DEVICEEVENT 0x0000000B

#define SERVICE_CONTROL_HARDWAREPROFILECHANGE 0x0000000C

#define SERVICE_CONTROL_POWEREVENT 0x0000000D

#define SERVICE_CONTROL_SESSIONCHANGE 0x0000000E

#define SERVICE_CONTROL_PRESHUTDOWN 0x0000000F

#define SERVICE_CONTROL_TIMECHANGE 0x00000010

#define SERVICE_CONTROL_TRIGGEREVENT 0x00000020

*/

DWORD dwControl = SERVICE_CONTROL_STOP;

SERVICE_STATUS serviceStatus = { 0 };

//关闭服务

ret = ControlService(serviceHandle, dwControl, &serviceStatus);

//〖1052〗-请求的控件对此服务无效。〖1062〗-服务未启动。

printf("ControlService serviceHandle=%p, dwControl=%ld -> ret=%d, GetLastError()=%ld -> serviceStatus.dwServiceType=%ld, dwCurrentState=%ld, dwControlsAccepted=%ld, dwWin32ExitCode=%ld, dwServiceSpecificExitCode=%ld, dwCheckPoint=%ld, dwWaitHint=%ld\n",

serviceHandle, dwControl, ret, GetLastError(),

serviceStatus.dwServiceType,

serviceStatus.dwCurrentState,

serviceStatus.dwControlsAccepted,

serviceStatus.dwWin32ExitCode,

serviceStatus.dwServiceSpecificExitCode,

serviceStatus.dwCheckPoint,

serviceStatus.dwWaitHint

);

//The CloseServiceHandle function does not destroy the service control manager object referred to by the handle. A service control manager object cannot be destroyed. A service object can be destroyed by calling the DeleteService function.

CloseServiceHandle(serviceHandle);

DeleteService(serviceHandle);

}

CloseServiceHandle(scHandle);

DeleteService(serviceHandle);

}

system("pause");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值