我们如何找到正在运行的Windows服务的进程ID?

时间:2009-11-21 00:58:23

标签: c++ winapi windows-services

我正在寻找一种找到特定Windows服务的进程ID的好方法。

特别是,我需要找到Windows附带的默认“WebClient”服务的pid。它作为svchost.exe进程中的“本地服务”托管。我看到当我使用netstat查看哪些进程正在使用它在进程名下列出[WebClient]的端口时,所以我希望有一些(相对)简单的机制来查找这些信息。

2 个答案:

答案 0 :(得分:5)

QueryServiceStatusEx返回SERVICE_STATUS_PROCESS,其中包含运行服务的进程的进程标识符。

您可以使用OpenService从名称中获取服务句柄。

答案 1 :(得分:0)

这是一个极简的C ++函数,可以完全执行您想要的操作:

DWORD GetServicePid(const char* serviceName)
{
    const auto hScm = OpenSCManager(nullptr, nullptr, NULL);
    const auto hSc = OpenService(hScm, serviceName, SERVICE_QUERY_STATUS);

    SERVICE_STATUS_PROCESS ssp = {};
    DWORD bytesNeeded = 0;
    QueryServiceStatusEx(hSc, SC_STATUS_PROCESS_INFO, reinterpret_cast<LPBYTE>(&ssp), sizeof(ssp), &bytesNeeded);

    CloseServiceHandle(hSc);
    CloseServiceHandle(hScm);

    return ssp.dwProcessId;
}