我如何从进程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;
}
}
枚举所有使用EnumServicesStatusEx服务(通过SERVICE_WIN32
作为服务类型)。在输出中,将获得包含服务名称的ENUM_SERVICE_STATUS_PROCESS
结构和另一个SERVICE_STATUS_PROCESS
结构,其中有DWORD dwProcessId
字段。
这样您就可以将进程ID映射到服务名称/密钥。
我试过这个,我用我的代码更新了我的原始文章,但它似乎从未匹配进程ID到EnumServicesSatusEx的进程ID,因为它永远不会进入我的if检查并从不显示服务名称 – Bullsfan127 2012-07-16 16:07:38
@ Bullsfan127您的代码打印出正确的PID。你有没有在任务管理器中看到你的服务?它的PID(或至少名称)在枚举过程中是否出现? – 2012-07-16 16:26:37
进程ID显示正确,并与我的任务管理器中的ID匹配,但是当它检索所有进程ID并显示它们时,所有服务名称和ID的显示都正确,但我正在使用的进程显示为0如果它不活动。 – Bullsfan127 2012-07-17 12:48:32
你是什么意思的服务名称? 'services.msc'中的名称或可执行文件的名称? – Dennis 2012-07-16 15:14:16
在服务中的名称 – Bullsfan127 2012-07-16 16:07:55