Получить полный список запущенных процессов (Visual C ++) - PullRequest
16 голосов
/ 13 августа 2010

В настоящее время я использую функцию EnumProcesses для получения списка запущенных процессов. Однако, поскольку мое приложение работает в пространстве пользователя, оно не может получить дескрипторы процессов, не запущенных под пользователем, включая системные процессы. Есть ли другой метод, который даст мне доступ к этим? Все, что мне нужно, это имена процессов.

Ответы [ 4 ]

11 голосов
/ 13 августа 2010

Я наконец нашел решение (цифры после публикации здесь, как моя последняя отчаянная попытка).Если кому-то еще нужен только список имен процессов, запущенных в системе (все процессы), это сделает это за вас.

11 голосов
/ 28 марта 2013

Просто чтобы добавить к этому ответу, я построил его для случаев, когда вы ищете только один конкретный процесс вместо всего списка.

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

Следует отметить, что это было написано в Embarcadero RAD Studio(C ++ Builder) и согласно @Remy_Lebeau System :: AnsiString - строковый класс C ++ Builder для 8-битных символьных данных ANSI в его средах VCL / FMX.

4 голосов
/ 09 февраля 2017

Если вам нужны только имена процессов, используйте WTSEnumerateProcesses как таковой:

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

Преимущество использования этого метода заключается в том, что вам не нужно открывать каждый процесс по отдельности, а затем извлекать его имя как то, что вам нужно сделать, если вы пошли с EnumProcesses , который также выиграл не будет работать, если вы попытаетесь открыть процессы, которые работают с более высокими правами, чем ваша учетная запись пользователя.

Кроме того, этот метод также намного быстрее, чем вызов Process32First() / Process32Next() в цикле.

WTSEnumerateProcesses - это менее известный API, доступный с Windows XP.

0 голосов
/ 13 августа 2010

Запрос WMI (вполне возможно с использованием COM-интерфейса WMI, но вам нужно будет перевести документацию, ориентированную на VB (Script)) может помочь здесь Класс Win32_Process содержит то, что вам нужно.

Однако я не проверял это, я думаю, вы найдете ту же проблему: не администратор может видеть только свои собственные процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...