如何获取进程所有者的UserName?

我正在尝试获取当前用户当前拥有的进程列表( Environment.UserName )。 不幸的是, Process类没有任何方法来获取用户拥有进程的UserName。

如何使用Process类获取用户的UserName,因为我可以将它与Environment.UserName进行比较?

如果您的解决方案需要pinvoke ,请提供代码示例。

CodeProject文章如何获取 Warlib的 进程所有者ID和当前用户SID描述了如何使用WMI和通过PInvoke使用Win32 API来执行此操作。

WMI代码更简单,但执行速度较慢。 您的问题并未表明哪种情况更适合您的方案。

谢谢,你的回答让我走上了正确的道路。 对于那些需要代码示例的人:

 public class App { public static void Main(string[] Args) { Management.ManagementObjectSearcher Processes = new Management.ManagementObjectSearcher("SELECT * FROM Win32_Process"); foreach (Management.ManagementObject Process in Processes.Get()) { if (Process["ExecutablePath"] != null) { string ExecutablePath = Process["ExecutablePath"].ToString(); string[] OwnerInfo = new string[2]; Process.InvokeMethod("GetOwner", (object[]) OwnerInfo); Console.WriteLine(string.Format("{0}: {1}", IO.Path.GetFileName(ExecutablePath), OwnerInfo[0])); } } Console.ReadLine(); } } 

您可以查看使用System.Management(WMI)。 有了它,您可以查询Win32_Process树。

这是标有“Win32_Process类的GetOwner方法”的MS链接

如果不是计算机管理员,您将很难获得用户名。

除非您是管理员,否则通过OpenProcess或使用WTSEnumerateProcesses的WMI方法都不会为您提供用户名。 试图启用SeDebugPrivilege等也不起作用。 我仍然看到一个无需管理员即可运行的代码。

如果有人知道如何获得这个没有成为正在运行的机器上的管理员,请写下如何做,因为我还没有找到如何启用对服务用户的访问级别。

转向Andrew Moore的回答,我只是将其格式化,因为它没有在C#3.5中编译。

 private string GetUserName(string procName) { string query = "SELECT * FROM Win32_Process WHERE Name = \'" + procName + "\'"; var procs = new System.Management.ManagementObjectSearcher(query); foreach (System.Management.ManagementObject p in procs.Get()) { var path = p["ExecutablePath"]; if (path != null) { string executablePath = path.ToString(); string[] ownerInfo = new string[2]; p.InvokeMethod("GetOwner", (object[])ownerInfo); return ownerInfo[0]; } } return null; } 

您需要添加对System.Management.dll的引用才能生效。

这是我最终使用的。 它适用于.NET 3.5:

 using System.Linq; using System.Management; class Program { ///  /// Adapted from https://www.codeproject.com/Articles/14828/How-To-Get-Process-Owner-ID-and-Current-User-SID ///  public static void GetProcessOwnerByProcessId(int processId, out string user, out string domain) { user = "???"; domain = "???"; var sq = new ObjectQuery("Select * from Win32_Process Where ProcessID = '" + processId + "'"); var searcher = new ManagementObjectSearcher(sq); if (searcher.Get().Count != 1) { return; } var process = searcher.Get().Cast().First(); var ownerInfo = new string[2]; process.InvokeMethod("GetOwner", ownerInfo); if (user != null) { user = ownerInfo[0]; } if (domain != null) { domain = ownerInfo[1]; } } public static void Main() { var processId = System.Diagnostics.Process.GetCurrentProcess().Id; string user; string domain; GetProcessOwnerByProcessId(processId, out user, out domain); System.Console.WriteLine(domain + "\\" + user); } }