none
c#获取进程用户名 RRS feed

  • 问题

  • 如题,我想通过c#做一个进程查看工具,但是不知道要如何获得启动进程的用户名?请高手指教
    2010年4月5日 3:30

答案

  • using System.Diagnostics;
    
    using System.Management;
    
     private static string GetProcessUserName(int pID)
            {
    
                string text1 = null;
    
                SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID);
                ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1);
    
                try
                {
                    foreach (ManagementObject disk in searcher1.Get())
                    {
                        ManagementBaseObject inPar = null;
                        ManagementBaseObject outPar = null;
    
                        inPar = disk.GetMethodParameters("GetOwner");
    
                        outPar = disk.InvokeMethod("GetOwner", inPar, null);
    
                        text1 = outPar["User"].ToString();
                        break;
                    }
                }
                catch
                {
                    text1 = "SYSTEM";
                }
    
                return text1;
            }
    
    
     private void button1_Click(object sender, EventArgs e)
            {
              
                foreach (Process p in Process.GetProcesses())
                {
                    Console.Write(p.ProcessName);
                    MessageBox.Show(p.ProcessName + "---" + GetProcessUserName(p.Id));
    
                }
    
    
    
            }
    

    努力+方法=成功
    2010年4月6日 1:28
  • using System.Diagnostics;
    
    using System.Management;
    
     private static string GetProcessUserName(int pID)
            {
    
                string text1 = null;
    
                SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID);
                ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1);
    
                try
                {
                    foreach (ManagementObject disk in searcher1.Get())
                    {
                        ManagementBaseObject inPar = null;
                        ManagementBaseObject outPar = null;
    
                        inPar = disk.GetMethodParameters("GetOwner");
    
                        outPar = disk.InvokeMethod("GetOwner", inPar, null);
    
                        text1 = outPar["User"].ToString();
                        break;
                    }
                }
                catch
                {
                    text1 = "SYSTEM";
                }
    
                return text1;
            }
    
    
     private void button1_Click(object sender, EventArgs e)
            {
              
                foreach (Process p in Process.GetProcesses())
                {
                    Console.Write(p.ProcessName);
                    MessageBox.Show(p.ProcessName + "---" + GetProcessUserName(p.Id));
    
                }
    
    
    
            }
    
    

    努力+方法=成功

    你好!

    上面的方法能正确获取到用户名。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 漫步者 2010年4月8日 7:58
    2010年4月8日 1:55
    版主
  • 你好!

    我查了一下资料并没有找到其它可以得到用户名的方式。我把上面的过程优化了一下,效率提高了一倍多,希望对你有帮助。

    class ProcessInfo
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string UserName { get; set; }
    
        public ProcessInfo(string id, string name, string userName)
        {
            this.Id = id;
            this.Name = name;
            this.UserName = userName;
        }
    }
    
    static void Main(string[] args)
    {
        DateTime begin = DateTime.Now;
    
        List<ProcessInfo> processInfoCollection = new List<ProcessInfo>();
    
        ManagementObjectCollection queryCollection = new ManagementObjectSearcher("SELECT * FROM Win32_Process").Get();
    
        foreach (ManagementObject mo in queryCollection)
        {
            ManagementBaseObject inPar = mo.GetMethodParameters("GetOwner"); ;
            ManagementBaseObject outPar = mo.InvokeMethod("GetOwner", inPar, null);
    
            string userName = (outPar["User"] == null) ? string.Empty : outPar["User"].ToString();
            processInfoCollection.Add(new ProcessInfo(mo["ProcessID"].ToString(), mo["Name"].ToString(), userName));
        }
    
        foreach (ProcessInfo p in processInfoCollection)
        {
            Console.WriteLine("ProcessID      : {0}", p.Id);
            Console.WriteLine("ProcessName    : {0}", p.Name);
            Console.WriteLine("ProcessUserName: {0}", p.UserName);
            Console.WriteLine();
        }
    
        Console.WriteLine("CostSeconds: {0}", (DateTime.Now - begin).TotalSeconds.ToString("f2"));
        Console.ReadKey();
    }


    知识改变命运,奋斗成就人生!
    • 已标记为答案 漫步者 2010年4月8日 14:07
    2010年4月8日 9:32
    版主

全部回复

  • 用 Process.GetProcesses() 找到进程实例后,Process 类型上就有对应的 StartInfo 属性,然后用 UserName 属性可以直接得到用户名。


    Mark Zhou
    2010年4月5日 9:53
  • Process.GetProcesses() 获取进程集合,遍历就行了
    2010年4月5日 14:08
  • using System.Diagnostics;
    
    using System.Management;
    
     private static string GetProcessUserName(int pID)
            {
    
                string text1 = null;
    
                SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID);
                ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1);
    
                try
                {
                    foreach (ManagementObject disk in searcher1.Get())
                    {
                        ManagementBaseObject inPar = null;
                        ManagementBaseObject outPar = null;
    
                        inPar = disk.GetMethodParameters("GetOwner");
    
                        outPar = disk.InvokeMethod("GetOwner", inPar, null);
    
                        text1 = outPar["User"].ToString();
                        break;
                    }
                }
                catch
                {
                    text1 = "SYSTEM";
                }
    
                return text1;
            }
    
    
     private void button1_Click(object sender, EventArgs e)
            {
              
                foreach (Process p in Process.GetProcesses())
                {
                    Console.Write(p.ProcessName);
                    MessageBox.Show(p.ProcessName + "---" + GetProcessUserName(p.Id));
    
                }
    
    
    
            }
    

    努力+方法=成功
    2010年4月6日 1:28
  • 得到的所有进程的username都是空的
    2010年4月7日 8:23
  • 确实是空的,看来我得办法行不通。
    Mark Zhou
    2010年4月7日 8:47
  • using System.Diagnostics;
    
    using System.Management;
    
     private static string GetProcessUserName(int pID)
            {
    
                string text1 = null;
    
                SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID);
                ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1);
    
                try
                {
                    foreach (ManagementObject disk in searcher1.Get())
                    {
                        ManagementBaseObject inPar = null;
                        ManagementBaseObject outPar = null;
    
                        inPar = disk.GetMethodParameters("GetOwner");
    
                        outPar = disk.InvokeMethod("GetOwner", inPar, null);
    
                        text1 = outPar["User"].ToString();
                        break;
                    }
                }
                catch
                {
                    text1 = "SYSTEM";
                }
    
                return text1;
            }
    
    
     private void button1_Click(object sender, EventArgs e)
            {
              
                foreach (Process p in Process.GetProcesses())
                {
                    Console.Write(p.ProcessName);
                    MessageBox.Show(p.ProcessName + "---" + GetProcessUserName(p.Id));
    
                }
    
    
    
            }
    
    

    努力+方法=成功

    你好!

    上面的方法能正确获取到用户名。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 漫步者 2010年4月8日 7:58
    2010年4月8日 1:55
    版主
  • 谢谢,确实能够读出来;不过我想每次获取到所有进程的用户名,用这个函数效率太慢了,有没有什么优化方法吗?
    2010年4月8日 7:59
  • 你好!

    我查了一下资料并没有找到其它可以得到用户名的方式。我把上面的过程优化了一下,效率提高了一倍多,希望对你有帮助。

    class ProcessInfo
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string UserName { get; set; }
    
        public ProcessInfo(string id, string name, string userName)
        {
            this.Id = id;
            this.Name = name;
            this.UserName = userName;
        }
    }
    
    static void Main(string[] args)
    {
        DateTime begin = DateTime.Now;
    
        List<ProcessInfo> processInfoCollection = new List<ProcessInfo>();
    
        ManagementObjectCollection queryCollection = new ManagementObjectSearcher("SELECT * FROM Win32_Process").Get();
    
        foreach (ManagementObject mo in queryCollection)
        {
            ManagementBaseObject inPar = mo.GetMethodParameters("GetOwner"); ;
            ManagementBaseObject outPar = mo.InvokeMethod("GetOwner", inPar, null);
    
            string userName = (outPar["User"] == null) ? string.Empty : outPar["User"].ToString();
            processInfoCollection.Add(new ProcessInfo(mo["ProcessID"].ToString(), mo["Name"].ToString(), userName));
        }
    
        foreach (ProcessInfo p in processInfoCollection)
        {
            Console.WriteLine("ProcessID      : {0}", p.Id);
            Console.WriteLine("ProcessName    : {0}", p.Name);
            Console.WriteLine("ProcessUserName: {0}", p.UserName);
            Console.WriteLine();
        }
    
        Console.WriteLine("CostSeconds: {0}", (DateTime.Now - begin).TotalSeconds.ToString("f2"));
        Console.ReadKey();
    }


    知识改变命运,奋斗成就人生!
    • 已标记为答案 漫步者 2010年4月8日 14:07
    2010年4月8日 9:32
    版主
  • 谢谢,不过就是有点看不太懂。能给讲讲吗?还有,通过这个还能获取到进程的其它信息吗?比如路径、内存之类的
    2010年4月8日 14:07