Оптимизация запросов 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
метод.