c++ - que - ver procesos de un usuario linux
¿Cómo puedo gestionar un proceso por su nombre en C++? (5)
Consulte: artículo de MSDN
Puede usar GetModuleName
(¿me parece?) Para obtener el nombre y verificarlo.
Estoy tratando de obtener el identificador del proceso, digamos example.exe, para poder llamar a TerminateProcess
en él. ¿Cómo puedo hacer esto? Tenga en cuenta que no tiene una ventana, por lo que FindWindow
no funcionará.
El siguiente código muestra cómo puede usar toolhelp y OpenProcess para obtener un control del proceso. Se eliminó el manejo de errores por brevedad.
HANDLE GetProcessByName(PCSTR name)
{
DWORD pid = 0;
// Create toolhelp snapshot.
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
// Walkthrough all processes.
if (Process32First(snapshot, &process))
{
do
{
// Compare process.szExeFile based on format of name, i.e., trim file path
// trim .exe if necessary, etc.
if (string(process.szExeFile) == string(name))
{
pid = process.th32ProcessID;
break;
}
} while (Process32Next(snapshot, &process));
}
CloseHandle(snapshot);
if (pid != 0)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
}
// Not found
return NULL;
}
Función OpenProcess
Desde MSDN:
Para abrir un identificador a otro proceso local y obtener derechos de acceso completos, debe habilitar el privilegio SeDebugPrivilege.
Hay dos técnicas básicas. El primero usa PSAPI; MSDN tiene un ejemplo que usa EnumProcesses
, OpenProcess
, EnumProcessModules
y GetModuleBaseName
.
El otro usa Toolhelp, que prefiero. Use CreateToolhelp32Snapshot
para obtener una instantánea de la lista de procesos, camine sobre ella con Process32First
y Process32Next
, que proporciona el nombre del módulo y la ID del proceso, hasta que encuentre la que desea, y luego llame a OpenProcess
para obtener un identificador.
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
int main( int, char *[] )
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
Además, si desea utilizar PROCESS_ALL_ACCESS en OpenProcess, podría intentar esto:
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
void EnableDebugPriv()
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
CloseHandle(hToken);
}
int main( int, char *[] )
{
EnableDebugPriv();
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}