【C++】获取指定服务的状态

问题

想要获取某个服务的当前运行状态,简单记录一下。

分析

主要需要OpenSCManagerOpenServiceQueryServiceStatus三个函数。

1、OpenSCManager

cpp 复制代码
SC_HANDLE OpenSCManagerA(
  [in, optional] LPCSTR lpMachineName,
  [in, optional] LPCSTR lpDatabaseName,
  [in]           DWORD  dwDesiredAccess
);
  • 作用:与指定计算机上的服务控制管理器建立连接,并打开指定的服务控制管理器数据库。
  • 参数说明:
    • lpMachineName:目标计算机的名称。 如果指针为 NULL 或指向空字符串,则函数将连接到本地计算机上的服务控制管理器。
    • lpDatabaseName:服务控制管理器数据库的名称。 此参数应设置为 SERVICES_ACTIVE_DATABASE。 如果为 NULL,则默认打开SERVICES_ACTIVE_DATABASE数据库。
    • dwDesiredAccess:对服务控制管理器的访问。

2、OpenService 打开现有服务

cpp 复制代码
SC_HANDLE OpenServiceA(
  [in] SC_HANDLE hSCManager,
  [in] LPCSTR    lpServiceName,
  [in] DWORD     dwDesiredAccess
);
  • 参数说明:
    • hSCManager:服务控制管理器数据库的句柄。 OpenSCManager 函数返回此句柄
    • lpServiceName:要打开的服务的名称
    • dwDesiredAccess:对服务的访问权限

3、QueryServiceStatus检索指定服务的当前状态

cpp 复制代码
BOOL QueryServiceStatus(
  [in]  SC_HANDLE        hService,
  [out] LPSERVICE_STATUS lpServiceStatus
);
  • 参数说明:
    • hService:服务的句柄。 此句柄由 OpenService 或 CreateService 函数返回,并且它必须具有SERVICE_QUERY_STATUS访问权限。
    • lpServiceStatus:指向接收状态信息的 SERVICE_STATUS 结构的指针。

解决

示例代码:

cpp 复制代码
CString sServer;
SC_HANDLE sc_Handle = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
SC_HANDLE sc_HandleService = OpenService(sc_Handle, sServer, SERVICE_QUERY_STATUS);
if (sc_HandleService == NULL)
{
	DWORD YE = GetLastError();
	switch (YE)
	{
	case ERROR_SERVICE_DOES_NOT_EXIST:
		break;
	case 6://权限不够
		break;
	}
	CloseServiceHandle(sc_Handle);
	CloseServiceHandle(sc_HandleService);
	return;
}

SERVICE_STATUS status;
QueryServiceStatus(sc_HandleService, &status);
switch (status.dwCurrentState)
{
case SERVICE_RUNNING:AfxMessageBox(_T("服务正在运行"));
case SERVICE_STOPPED:AfxMessageBox(_T("服务未运行"));
case SERVICE_START_PENDING:AfxMessageBox(_T("服务正在启动"));
case SERVICE_STOP_PENDING:AfxMessageBox(_T("服务正在停止"));
case SERVICE_CONTINUE_PENDING:AfxMessageBox(_T("服务即将继续"));
case SERVICE_PAUSE_PENDING:AfxMessageBox(_T("服务即将暂停"));
case SERVICE_PAUSED:AfxMessageBox(_T("服务已暂停"));
}
CloseServiceHandle(sc_Handle);
CloseServiceHandle(sc_HandleService);
相关推荐
石像鬼₧魂石3 分钟前
Fail2Ban 一键部署 + 管理脚本(可直接执行)
linux·windows·学习·ubuntu
石像鬼₧魂石8 分钟前
Fail2Ban 实战终极速查表
linux·windows·学习·ubuntu
霍田煜熙11 分钟前
C++ 部署小型图书管理系统
开发语言·c++·算法
@小码农17 分钟前
2025年厦门市小学生信息学竞赛C++(初赛)真题-附答案
开发语言·c++·python·算法·蓝桥杯
闻缺陷则喜何志丹18 分钟前
【计算几何】凸多变形的定义
c++·数学·计算几何·凸多边形
zore_c23 分钟前
【C语言】Win 32 API——一部分内容详解!!!
c语言·开发语言·c++·经验分享·笔记
郝学胜-神的一滴26 分钟前
Linux线程编程:从原理到实践
linux·服务器·开发语言·c++·程序人生·设计模式·软件工程
..空空的人29 分钟前
C++基于protobuf实现仿RabbitMQ消息队列---技术认识2
服务器·数据库·c++·网络协议·gtest·异步·protobuf
Chen--Xing30 分钟前
LeetCode 11.盛最多水的容器
c++·python·算法·leetcode·rust·双指针
DeltaTime31 分钟前
二 线性变换, 齐次坐标, 变换组合, 变换分解, 3D变换
c++·3d·图形渲染