Win32_Process 查询优化

Win32_Process query optimization

我正在对 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- ("SELECT TOP 1 * FROM Win32_Process WHERE ProcessID = " + processId);

但是:不接受(无效查询)

2- Using Linq to sql to get the first or default value directly with linq

但是:没能做到

3-("SELECT TOP 1 ExecutablePath FROM Win32_Process WHERE ProcessID = " + processId);

但假设 TOP 1 有效,我不能:

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

那么让这个函数尽可能快的最佳解决方案是什么

你应该直接使用Windows API。您可以尝试使用来自 NTDLL.dll 的名为 NTQuerySystemInformation 的函数或使用 ToolHelp32

的更高级别的 kernel32 函数

Google如何P/Invoke那些函数并使用它们。 C# 为您提供了与 WinAPI 功能交互的非常强大的接口,您必须使用它来完成此类任务。

您可以使用 "Handle" 和 "ExecutablePath" 限制检索数据。

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

使用进程句柄,您可以调用 GetOwner 方法。