ver procesos gestion ejecucion corriendo comando aux administracion winapi visual-c++ process

winapi - gestion - Obtener la lista de procesos en ejecución completa(Visual C++)



ver procesos en ejecucion linux (4)

Finalmente encontré una solución (cifras después de publicar aquí como mi último intento desesperado). Si alguien más solo necesita una lista de nombres de procesos ejecutándose en el sistema (todos los procesos), esto lo hará por usted.

Procesar Caminar

Actualmente estoy usando la función EnumProcesses para obtener una lista de procesos en ejecución. Sin embargo, dado que mi aplicación se ejecuta en espacio de usuario, no puede obtener identificadores para procesos que no se ejecutan bajo el usuario, incluidos los procesos del sistema. ¿Hay algún otro método que me dé acceso a estos? Todo lo que necesito son los nombres de los procesos.


Una consulta WMI (bastante posible usando la interfaz COM de WMI, pero necesitarás traducir la documentación enfocada de VB (Script)) podría ayudar aquí. La clase Win32_Process contiene lo que necesita.

Sin embargo, no he probado esto, creo que encontrará el mismo problema: un no administrador solo puede ver sus propios procesos.


Solo para agregar a esta respuesta, construí esto para casos en los que busca un solo proceso en particular en lugar de toda la lista.

bool FindRunningProcess(AnsiString process) { /* Function takes in a string value for the process it is looking for like ST3Monitor.exe then loops through all of the processes that are currently running on windows. If the process is found it is running, therefore the function returns true. */ AnsiString compare; bool procRunning = false; HANDLE hProcessSnap; PROCESSENTRY32 pe32; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { procRunning = false; } else { pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { // Gets first running process if (pe32.szExeFile == process) { procRunning = true; } else { // loop through all running processes looking for process while (Process32Next(hProcessSnap, &pe32)) { // Set to an AnsiString instead of Char[] to make compare easier compare = pe32.szExeFile; if (compare == process) { // if found process is running, set to true and break from loop procRunning = true; break; } } } // clean the snapshot object CloseHandle(hProcessSnap); } } return procRunning; }

Debo señalar que esto fue escrito en Embarcadero RAD Studio (C ++ Builder) y por @Remy_Lebeau System :: AnsiString es una clase de cadena C ++ Builder para datos de caracteres ANSI de 8 bits en sus marcos VCL / FMX.


Si todo lo que necesita son solo nombres de procesos, entonces use WTSEnumerateProcesses como tal:

WTS_PROCESS_INFO* pWPIs = NULL; DWORD dwProcCount = 0; if(WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &pWPIs, &dwProcCount)) { //Go through all processes retrieved for(DWORD i = 0; i < dwProcCount; i++) { //pWPIs[i].pProcessName = process file name only, no path! //pWPIs[i].ProcessId = process ID //pWPIs[i].SessionId = session ID, if you need to limit it to the logged in user processes //pWPIs[i].pUserSid = user SID that started the process } } //Free memory if(pWPIs) { WTSFreeMemory(pWPIs); pWPIs = NULL; }

El beneficio de utilizar este método es que no tiene que abrir cada proceso individualmente y luego recuperar su nombre como lo que tendría que hacer si fuera con EnumProcesses , que tampoco funcionará si intenta abrir procesos. que se ejecuta con privilegios superiores a su cuenta de usuario.

Además, este método también es mucho más rápido que llamar a Process32First() / Process32Next() en un bucle.

WTSEnumerateProcesses es una API menos conocida que ha estado disponible desde Windows XP.