Win32_Process查询优化

时间:2017-09-07 10:45:48

标签: c# sql linq 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-(&#34; SELECT TOP 1 * FROM Win32_Process WHERE ProcessID =&#34; +   的ProcessID);

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

  

2-使用Linq to sql直接获取第一个或默认值   LINQ

但是:无法成功

  

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

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

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

那么这个功能的最佳解决方案是尽可能快的

2 个答案:

答案 0 :(得分:5)

您应该直接使用Windows API。你可以尝试使用来自NTDLL.dll的函数NTQuerySystemInformation或更高级别的kernel32函数使用ToolHelp32

Google如何P / Invoke这些功能并使用它们。 C#为您提供了与WinAPI功能交互的强大界面,您必须将它用于此类任务。

答案 1 :(得分:0)

您可以使用“处理”和“可执行路径”限制检索数据。

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

使用流程处理,您可以调用GetOwner方法。