2012-07-16 98 views
1

我使用下面的代碼以及進程名稱得到了正在運行的服務的進程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

回答

2

枚舉所有使用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