我正在创建远程任务管理器应用程序,并且正在尝试找出如何在没有 WMI 的情况下获得在远程计算机上运行的进程的进程所有者。使用 WMI 确实很容易,但速度太慢。我尝试使用 WTSQuerySessionInformation,但它仅适用于本地计算机。
为了更详细地说明,我的远程任务管理器应用程序将在工作站上运行,并将连接到另一个工作站以及同一网络中的服务器。将运行该应用程序的用户将是两台计算机上的管理员。
请问,您是否知道如何获得远程进程的所有者的另一种方法,或者对下面的代码进行一些改进/修复?
public static Dictionary<Process, string> GetOwners(this IEnumerable<Process> processes)
{
Dictionary<Process, string> result = new Dictionary<Process, string>();
if (processes == null || processes.Count() == 0) { return result; }
string select = "SELECT Handle, ProcessID FROM Win32_Process";
select += processes.Count() <= 10 ? string.Format(" WHERE ProcessID = {0}", string.Join(" OR ProcessID = ", processes.Select(p => p.Id))) : string.Empty;
ManagementScope scope = new ManagementScope(string.Format("\\\\{0}\\root\\cimv2", processes.ElementAt(0).MachineName));
SelectQuery selectQuery = new SelectQuery(select);
scope.Connect();
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, selectQuery))
{
using (ManagementObjectCollection objectCollection = searcher.Get())
{
foreach (ManagementObject managementObject in objectCollection)
{
try
{
int id = Convert.ToInt32(managementObject["ProcessID"]);
string owner = managementObject.InvokeMethod("GetOwner", null, null)["User"]?.ToString();
result.Add(processes.Single(p => p.Id == id), owner);
}
catch
{
}
}
}
}
return result;
}
婷婷同学_
湖上湖
相关分类