2010-08-13 10 views
14

Ich verwende derzeit die EnumProcesses-Funktion, um eine Liste der laufenden Prozesse zu erhalten. Da meine Anwendung jedoch im Benutzerbereich ausgeführt wird, kann sie keine Prozeduren für Prozesse abrufen, die nicht unter dem Benutzer ausgeführt werden, einschließlich Systemprozesse. Gibt es eine andere Methode, die mir Zugang zu diesen gibt? Alles was ich brauche sind die Prozessnamen.Holen Sie sich die vollständige laufende Prozessliste (Visual C++)

Antwort

9

Ich habe endlich eine Lösung gefunden (Zahlen nach dem Posten hier als mein letzter verzweifelter Versuch). Wenn jemand anderes nur eine Liste von Prozessnamen benötigt, die auf dem System laufen (alle Prozesse), wird dies für Sie erledigt.

Process Walking

0

Eine WMI-Abfrage (durchaus möglich mit WMI-COM-Schnittstelle, aber Sie müssen VB (Skript) fokussierte Dokumentation übersetzen) könnte hier helfen. Die Win32_Process Klasse enthält, was Sie brauchen.

Allerdings habe ich dies nicht getestet, ich denke, Sie werden das gleiche Problem finden: ein Nicht-Administrator kann nur ihre eigenen Prozesse sehen.

8

Gerade zu dieser Antwort hinzufügen, baute ich dies für die Fälle, wenn Sie nur für einen bestimmten Prozess statt der gesamten Liste suchen sind.

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; 
} 

Ich stelle fest, sollte hier das in Embarcadero RAD Studio (C++ Builder) und pro @Remy_Lebeau-System geschrieben wurde :: Ansistring ist eine C++ Builder-String-Klasse für 8-Bit-ANSI-Zeichendaten in der VCL/FMX-Frameworks.

+0

Das könnte Sie interessieren: http://stackoverflow.com/q/30604485/560648. –

+0

Danke, ich sollte hier notieren, dass dies in Embarcadero RAD Studio geschrieben wurde (C++ Builder) und per @Remy_Lebeau System :: AnsiString ist eine C++ Builder String-Klasse für 8-Bit-ANSI-Zeichendaten in seinen VCL/FMX-Frameworks. – Phil

+0

Auf jeden Fall lohnt es sich, dieses Detail zu Ihrer Antwort hinzuzufügen! Prost. –

1

Wenn alles, was Sie brauchen nur Prozessnamen sind, dann WTSEnumerateProcesses als solche verwendet werden:

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; 
} 

Der Vorteil der Verwendung dieser Methode ist, dass Sie für jeden Prozess einzeln nicht öffnen und dann seinen Namen abrufen als Was Sie tun müssten, wenn Sie stattdessen EnumProcesses verwenden würden, was auch nicht funktioniert, wenn Sie versuchen, Prozesse zu öffnen, die mit höheren Rechten als Ihr Benutzerkonto ausgeführt werden.

Zusätzlich ist diese Methode auch viel schneller als Aufruf Process32First()/Process32Next() in einer Schleife.

WTSEnumerateProcesses ist eine weniger bekannte API, die seit Windows XP verfügbar ist.

Verwandte Themen