Как я узнаю, что пользователю принадлежит какой процесс программно? - PullRequest
3 голосов
/ 26 февраля 2010

Хорошо, я пытаюсь выяснить имя пользователя, которому принадлежит данный процесс.

        Process[] processList = Process.GetProcesses();
        foreach (Process p in processList)
        {
            Console.WriteLine(p.Id);

        }
        Console.ReadLine();

В настоящее время я могу узнать идентификатор процесса каждого процесса, но не пользователя. Есть ли способ сказать, кто является пользователем, которому принадлежит процесс, если я знаю идентификатор процесса?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

Вы можете использовать класс Win32_Process из WMI для получения всей информации, связанной с процессом.

проверьте этот образец

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {

        public static string GetProcessOwner(int PID, out string User)
        {
            string DummyStr = String.Empty;
            User = String.Empty;
            string ProcessStr = String.Empty;
            try
            {
                ObjectQuery WMIQuery = new ObjectQuery(string.Format("Select * from Win32_Process Where ProcessID ={0}", PID.ToString()));
                ManagementObjectSearcher WMIResult = new ManagementObjectSearcher(WMIQuery);
                if (WMIResult.Get().Count == 0) return DummyStr;
                foreach (ManagementObject oItem in WMIResult.Get())
                {
                    string[] List = new String[2];
                    oItem.InvokeMethod("GetOwner", (object[])List);
                    ProcessStr = (string)oItem["Name"];
                    User = List[0];
                    if (User == null) User = String.Empty;
                    string[] StrSID = new String[1];
                    oItem.InvokeMethod("GetOwnerSid", (object[])StrSID);
                    DummyStr = StrSID[0];
                    return DummyStr;
                }
            }
            catch
            {
                return DummyStr;
            }
            return DummyStr;
        }

        static void Main(string[] args)
        {
          string User;

            Process[] processList = Process.GetProcesses();
            foreach (Process p in processList)
            {
                GetProcessOwner(p.Id,out User);
                Console.WriteLine(p.Id.ToString()+' '+User);

            }
            Console.ReadLine();



        }
    }
}

UPDATE

также вы можете хранить в словаре владельцев и pid, для повышения производительности.

using System;
using System.Diagnostics;
using System.Management;
using System.Text;
using System.Collections.Generic;


namespace ConsoleApplication2
{
    class Program
    {

        public static Dictionary<int, string> GetAllProcessOwners()
        {
            Dictionary<int, string> d = new Dictionary<int, string>();
            //string DummyStr = String.Empty;
            string User = String.Empty;
            string ProcessStr = String.Empty;
            try
            {
                ObjectQuery WMIQuery = new ObjectQuery("Select * from Win32_Process");
                ManagementObjectSearcher WMIResult = new ManagementObjectSearcher(WMIQuery);
                if (WMIResult.Get().Count == 0) return d;
                foreach (ManagementObject oItem in WMIResult.Get())
                {
                    string[] List = new String[2];
                    oItem.InvokeMethod("GetOwner", (object[])List);
                    ProcessStr = (string)oItem["Name"];
                    User = List[0];
                    if (User == null) User = String.Empty;
                    //string[] StrSID = new String[1];
                    //oItem.InvokeMethod("GetOwnerSid", (object[])StrSID);
                    //DummyStr = StrSID[0];
                    d.Add(Convert.ToInt32(oItem["ProcessId"]), User);
                }
            }
            catch (Exception E)
            {
                Console.WriteLine(E.Message);
                return d;
            }
            return d;
        }


        static void Main(string[] args)
        {
            Dictionary<int, string> List = GetAllProcessOwners();
            Process[] processList = Process.GetProcesses();
            foreach (Process p in processList)
            {                                
                if (List.ContainsKey(p.Id))
                {
                    Console.WriteLine(p.Id.ToString() + ' ' + List[p.Id]);
                }                
            }
        Console.ReadLine();
        }
    }
}
0 голосов
/ 26 февраля 2010

Здесь - способ получения пользователя через WMI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...