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

编程入门 行业动态 更新时间:2024-10-22 17:29:40

【C++】获取指定服务的<a href=https://www.elefans.com/category/jswz/34/1771386.html style=状态"/>

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

问题

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

分析

主要需要OpenSCManagerOpenServiceQueryServiceStatus三个函数。

1、OpenSCManager

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 打开现有服务

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

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

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

解决

示例代码:

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);

更多推荐

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

本文发布于:2023-11-17 02:38:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637227.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:状态

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!