代码之家  ›  专栏  ›  技术社区  ›  Andrew Moore

如何获取进程所有者的用户名?

  •  17
  • Andrew Moore  · 技术社区  · 17 年前

    我正在尝试获取当前用户当前拥有的进程列表( Environment.UserName ).不幸的是 Process 类无法获取拥有进程的用户的用户名。

    如何使用 过程 这样我就可以把它和 环境。用户名 ?

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

    7 回复  |  直到 12 年前
        1
  •  16
  •   Hand-E-Food    12 年前

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

    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();
        }
    }
    
        2
  •  11
  •   Martin Hollingsworth    17 年前

    CodeProject文章 How To Get Process Owner ID and Current User SID 靠近 Warlib 描述了如何使用WMI和通过PInvoke使用Win32 API来完成此操作。

    WMI代码要简单得多,但执行速度较慢。你的问题并没有表明哪一个更适合你的情况。

        3
  •  2
  •   palehorse    17 年前

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

    除非您是管理员,否则使用WMI、通过OpenProcess或使用WTSEnumerateProcesses的方法都不会为您提供用户名。尝试启用SeDebugPrivilege等也不起作用。我仍然需要看到一个在没有管理员身份的情况下正常工作的代码。

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

        4
  •  2
  •   Oskar    17 年前

    你可以考虑使用系统。管理(WMI)。有了它,您可以查询Win32_Process树。

        5
  •  2
  •   Wolf5    14 年前

    这是 MS link 标记为“Win32_Process类的GetOwner方法”

        6
  •  2
  •   sean.net    13 年前

    请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;
    }
    
        7
  •  0
  •   Jesus is Lord    8 年前

    您需要添加对System的引用。Management.dll使其工作。

    这是我最终使用的。它在里面工作。净值3.5:

    using System.Linq;
    using System.Management;
    
    class Program
    {
        /// <summary>
        /// Adapted from https://www.codeproject.com/Articles/14828/How-To-Get-Process-Owner-ID-and-Current-User-SID
        /// </summary>
        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<ManagementObject>().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);
        }
    }