2010-08-13 17 views
14

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.Obtener la lista de procesos en ejecución (Visual C++)

Respuesta

9

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.

Process Walking

0

Una consulta WMI (bastante posible usando la interfaz COM de WMI, pero necesitará traducir la documentación enfocada en 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.

8

sólo para añadir a esta respuesta, he construido esto para los casos cuando se 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 aquí que esto fue escrito en Embarcadero RAD Studio (C++ Builder) y por sistema @Remy_Lebeau :: AnsiString es una clase de cadena de C++ Builder para los datos de caracteres de 8 bits ANSI en sus marcos VCL/FMX.

+0

Puede estar interesado en esto: http://stackoverflow.com/q/30604485/560648. –

+0

Gracias, debería tener en cuenta 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. – Phil

+0

Definitivamente vale la pena agregar ese detalle a su respuesta! Aclamaciones. –

1

Si todo lo que necesita son sólo nombres de los procesos, a continuación, utilizar 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; 
} 

La ventaja de usar este método es que usted no tiene que abrir cada proceso individual 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 ejecutan con privilegios superiores a su cuenta de usuario.

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

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

Cuestiones relacionadas