问题
想要获取某个服务的当前运行状态,简单记录一下。
分析
主要需要OpenSCManager 、OpenService 和QueryServiceStatus三个函数。
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);