Estoy tratando de obtener el identificador de proceso de, digamos ejemplo.exe, para que pueda llamar al TerminateProcess
en él. ¿Cómo puedo hacer esto? Aviso, no tiene una ventana así que FindWindow
no funcionará.¿Cómo puedo obtener un identificador de proceso por su nombre en C++?
Respuesta
#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, puede probar 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;
}
Salida: MSDN Article
Puede utilizar GetModuleName
(creo?) Para obtener el nombre y comprobar que en contra.
La mayoría de los nombres GetModuleName, QueryFullProcessImage, etc., requieren un identificador y, por lo tanto, no serán de mucha utilidad. Toolhelp devuelve el nombre del proceso. – Michael
OpenProcess Función
De MSDN:
abrir un identificador a otro proceso local y obtener los derechos de acceso, debe habilitar el privilegio SeDebugPrivilege.
No tengo el pID, solo el nombre. – Malfist
SeDebugPrivilege definitivamente no es necesario para los procesos que se ejecutan como usted. Si tiene acceso al proceso a través de su ACL (que generalmente hace para los procesos que crea con el mismo nivel de integridad que su código), no necesita SeDebugPrivilege. Desde la misma página MSDN: Si la persona que llama ha habilitado el privilegio SeDebugPrivilege, el acceso solicitado se concede independientemente del contenido del descriptor de seguridad. – Michael
Sí, primero necesita obtener la identificación del proceso al iterar los procesos. –
Hay dos técnicas básicas. El primero usa PSAPI; MSDN tiene an example 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 al OpenProcess
para obtener un identificador.
El código siguiente muestra cómo se puede utilizar TOOLHELP y OpenProcess para obtener un identificador para el proceso de . 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;
}
Ha olvidado un paréntesis en la condición "if (MatchProcessName (process.szExeFile, name)" –
Al igual que la respuesta de xian, esta tiene una condición de carrera y es intrínsecamente insegura. – benrg
@Occulta 'if (string (process.szExeFile) == string (name)) 'se puede usar en lugar de esta función. Edité la respuesta de Michael. – bytecode77
- 1. C++ Obtener nombre de usuario Proceso De
- 2. Obtener una ruta de un proceso en ejecución por nombre
- 3. Obtener un componente Swing por su nombre
- 4. Obtener nombre del proceso por PID
- 5. ¿Puedo obtener un identificador para - fuente?
- 6. Cómo obtener el nombre del proceso en C++
- 7. Win32API - ¿Cómo obtener el nombre de archivo del proceso desde el control del proceso?
- 8. ¿Cómo puedo seleccionar una pestaña de IE desde su identificador
- 9. ¿Cómo puedo obtener un marco de datos con columnas eliminadas temporalmente por su nombre?
- 10. Cómo puedo obtener el nombre de contacto con su número
- 11. ¿Cómo obtener el ID del proceso del nombre del proceso?
- 12. ¿Cómo obtener un identificador de JVM único?
- 13. Busque un ID de proceso por nombre
- 14. Obtener hwnd por identificación del proceso C++
- 15. ¿Cómo obtengo el identificador de ventana dando el nombre del proceso que se está ejecutando?
- 16. ¿Por qué no se puede obtener el identificador de la ventana principal para un proceso iniciado?
- 17. ¿Cómo puedo obtener un stdin de proceso por una identificación de proceso?
- 18. ¿Cómo obtener el PID de un proceso dando el nombre del proceso en Mac OS X?
- 19. ¿Cómo puedo obtener recursos por su nombre (cadena) y no por el número entero
- 20. Cómo obtener un valor de un elemento por su nombre en lugar de ID
- 21. Cómo obtener un elemento que tiene: ¿en su nombre?
- 22. ¿Cómo puedo obtener un nombre de clave (en un hash) usando su valor?
- 23. clase por su nombre
- 24. cómo obtener el identificador del proceso desde la identificación del proceso?
- 25. ¿Puedo obtener Uri del archivo de imagen de su nombre?
- 26. ¿Cómo obtener el nombre actual del proceso en Linux?
- 27. ¿Cuándo Windows señala un identificador de proceso?
- 28. Conseguir la variable por su nombre en C#
- 29. ¿Cómo cerrar la ventana por su nombre?
- 30. ¿Cómo obtengo un selector de su nombre?
Su código omitirá el primer proceso en el sistema (sin embargo, el primer proceso es probablemente "SISTEMA" por lo que no hay errores visibles para el usuario.) – Michael
El primer proceso es SISTEMA, así que está bien (literalmente tomé ese código directamente de uno de mis proyectos);) – xian
Cuando intento actuar en el hProcess obtengo el código de error 6 que es ERROR_INVALID_HANDLE – Malfist