我如何从进程ID获取服务的名称?

问题描述:

我使用下面的代码以及进程名称得到了正在运行的服务的进程ID,但我真正想要的是服务名称/密钥。是否有方法可以从进程ID或进程名称?用C++我如何从进程ID获取服务的名称?

DWORD aProcesses[1024], cbNeeded, cProcesses; 
unsigned int i; 

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) 
{ 
    return 1; 
} 


// Calculate how many process identifiers were returned. 

cProcesses = cbNeeded/sizeof(DWORD); 

// Print the name and process identifier for each process. 

for (i = 0; i < cProcesses; i++) 
{ 
    if(aProcesses[i] != 0) 
    { 
     PrintProcessNameAndID(aProcesses[i]); 
    } 

} 

和..

void tt_coreutils_ns::PrintProcessNameAndID(DWORD processID) 
{ 
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); 

// Get a handle to the process. 

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
    PROCESS_VM_READ, 
    FALSE, processID); 

// Get the process name. 

if (NULL != hProcess) 
{ 
    HMODULE hMod; 
    DWORD cbNeeded; 

    if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), 
     &cbNeeded)) 
    { 
     GetModuleBaseName(hProcess, hMod, szProcessName, 
      sizeof(szProcessName)/sizeof(TCHAR)); 
    } 
} 

// Print the process name and identifier. 

_tprintf(TEXT("%s (PID: %u)\n"), szProcessName, processID); 

// Release the handle to the process. 

CloseHandle(hProcess); 

}

更新的代码

DWORD pId=GetCurrentProcessId(); 
SC_HANDLE hSCM = NULL; 
PUCHAR pBuf = NULL; 
ULONG dwBufSize = 0x00; 
ULONG dwBufNeed = 0x00; 
ULONG dwNumberOfService = 0x00; 


LPENUM_SERVICE_STATUS_PROCESS pInfo = NULL; 

hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT); 

if (hSCM == NULL) 
{ 
    printf_s("OpenSCManager fail \n"); 
    return 0xffff0001; 
} 

EnumServicesStatusEx(
    hSCM, 
    SC_ENUM_PROCESS_INFO, 
    SERVICE_WIN32, // SERVICE_DRIVER 
    SERVICE_STATE_ALL, 
    NULL, 
    dwBufSize, 
    &dwBufNeed, 
    &dwNumberOfService, 
    NULL, 
    NULL); 

if (dwBufNeed < 0x01) 
{ 
    printf_s("EnumServicesStatusEx fail ?? \n"); 
    return 0xffff0002; 
} 

dwBufSize = dwBufNeed + 0x10; 
pBuf = (PUCHAR) malloc(dwBufSize); 

EnumServicesStatusEx(
    hSCM, 
    SC_ENUM_PROCESS_INFO, 
    SERVICE_WIN32, // SERVICE_DRIVER, 
    SERVICE_ACTIVE, //SERVICE_STATE_ALL, 
    pBuf, 
    dwBufSize, 
    &dwBufNeed, 
    &dwNumberOfService, 
    NULL, 
    NULL); 

pInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf; 
for (ULONG i=0;i<dwNumberOfService;i++) 
{ 
    cout<<"display name "<<pInfo[i].lpDisplayName<<"\t service name: "; 
    cout<< pInfo[i].lpServiceName<<"\tid: "<<pInfo[i].ServiceStatusProcess.dwProcessId<<endl<<endl; 

    if(pId==pInfo[i].ServiceStatusProcess.dwProcessId) 
    { 
     cout<<pInfo->lpServiceName; 
    } 
} 
+0

你是什么意思的服务名称? 'services.msc'中的名称或可执行文件的名称? – Dennis 2012-07-16 15:14:16

+0

在服务中的名称 – Bullsfan127 2012-07-16 16:07:55

枚举所有使用EnumServicesStatusEx服务(通过SERVICE_WIN32作为服务类型)。在输出中,将获得包含服务名称的ENUM_SERVICE_STATUS_PROCESS结构和另一个SERVICE_STATUS_PROCESS结构,其中有DWORD dwProcessId字段。

这样您就可以将进程ID映射到服务名称/密钥。

+0

我试过这个,我用我的代码更新了我的原始文章,但它似乎从未匹配进程ID到EnumServicesSatusEx的进程ID,因为它永远不会进入我的if检查并从不显示服务名称 – Bullsfan127 2012-07-16 16:07:38

+0

@ Bullsfan127您的代码打印出正确的PID。你有没有在任务管理器中看到你的服务?它的PID(或至少名称)在枚举过程中是否出现? – 2012-07-16 16:26:37

+0

进程ID显示正确,并与我的任务管理器中的ID匹配,但是当它检索所有进程ID并显示它们时,所有服务名称和ID的显示都正确,但我正在使用的进程显示为0如果它不活动。 – Bullsfan127 2012-07-17 12:48:32