Оптимизация запросов Win32_Process

Я работаю над запросом на Win32_Process, чтобы получить некоторую информацию о запущенных процессах

ManagementObjectSearcher mSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessID = " + processId);

ManagementObject process = mSearcher.Get().Cast<ManagementObject>().FirstOrDefault();

    if (process != null)
        {
            string[] argList = {string.Empty, string.Empty};
            int returnVal = Convert.ToInt32(process.InvokeMethod("GetOwner", argList));
            Username = returnVal == 0 ? argList[0] : "";
            try
            {
                Description = FileVersionInfo.GetVersionInfo((string) process["ExecutablePath"]);
            }
            catch (Exception)
            {
                Description = "";
            }
        }

Этот запрос занимает много времени, поэтому я пытаюсь сделать комбинацию из 3 решений

1- ("ВЫБРАТЬ ТОП 1 * ИЗ Win32_Process WHERE ProcessID = " + processId);

Но: не принято (неверный запрос)

2- Использование Linq для sql, чтобы получить первое значение или значение по умолчанию напрямую с помощью linq

Но: не смог сделать это

3-("ВЫБЕРИТЕ ТОП 1 ExecutablePath ОТ Win32_Process WHERE ProcessID = " + processId);

но предполагая, что ТОП 1 сработал, я не могу:

int returnVal = Convert.ToInt32(process.InvokeMethod("GetOwner", argList));

Итак, что является лучшим решением для этой функции, чтобы быть максимально быстрой

2 ответа

Решение

Вы должны использовать Windows API напрямую. Вы можете попробовать использовать функцию под названием NTQuerySystemInformation из NTDLL.dll или более поздней функции kernel32, используя ToolHelp32

Google, как P/Invoke эти функции и использовать их. C# предоставляет вам очень сильный интерфейс для взаимодействия с функциями WinAPI, и вы должны использовать его для таких задач.

Вы можете ограничить получение данных с помощью "Handle" и "ExecutablePath".

ManagementObjectSearcher mSearcher = new ManagementObjectSearcher("SELECT Handle, ExecutablePath FROM Win32_Process WHERE ProcessID = " + processId);

С ручкой процесса вы можете позвонить GetOwner метод.

Другие вопросы по тегам