我正在对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));
那么这个功能的最佳解决方案是尽可能快的
答案 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
方法。