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
方法。
我正在对 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
Google如何P/Invoke那些函数并使用它们。 C# 为您提供了与 WinAPI 功能交互的非常强大的接口,您必须使用它来完成此类任务。
您可以使用 "Handle" 和 "ExecutablePath" 限制检索数据。
ManagementObjectSearcher mSearcher = new ManagementObjectSearcher("SELECT Handle, ExecutablePath FROM Win32_Process WHERE ProcessID = " + processId);
使用进程句柄,您可以调用 GetOwner
方法。