Как получить имя того, кто запустил процесс? C#

453
07 апреля 2017, 20:20

В диспетчере задач есть такой столбец "Пользователь" где пишется от кого запущен, админ или пользв, как вывести это? Пока что я смог только получать ID 1 или 0 (1-юзер, 0- админ), а нужно чтоб выдавало кто запустил процесс. Полная часть кода

UPD_1

 Process[] proces; 
    private void GetProcesses() 
    {
            ListViewItem row;
              proces = Process.GetProcesses();
                if (Convert.ToInt32(label2.Text) != proces.Length) 
                      {
                  LstProc.Items.Clear();
                  for (int i = 0; i < proces.Length; i++)
                      {
                 row = new ListViewItem(proces[i].ProcessName); 
                  row.SubItems.Add((proces[i].VirtualMemorySize64 / 2048).ToString() + " КБ");
                    row.SubItems.Add("Работает");
                      row.SubItems.Add(proces[i].SessionId.ToString());
                     LstProc.Items.Add(row);
                       List<ListViewItem> arrayToDelete = new List<ListViewItem>();
                          for (int j = 0; j < LstProc.Items.Count; j++)
                             if (LstProc.Items[j].SubItems[2].Text == "*")
                               arrayToDelete.Add(LstProc.Items[j]);
                                 foreach (ListViewItem delete in arrayToDelete)
                                    LstProc.Items.Remove(delete);
                                        }
                                        label2.Text = proces.Length.ToString();
                                        }
                  }
Answer 1
    using System.Management;
    ....
        string[] propertiesToSelect = new[] { "Handle", "ProcessId" };
        SelectQuery processQuery = new SelectQuery("Win32_Process", "Name = 'origin.exe'", propertiesToSelect); // тут нужно подставить имя процесса
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(processQuery))
        using (ManagementObjectCollection processes = searcher.Get())
            foreach (ManagementObject process in processes)
            {
                object[] outParameters = new object[2];
                uint result = (uint)process.InvokeMethod("GetOwner", outParameters);
                if (result == 0)
                {
                    string user = (string)outParameters[0]; //тут получаем имя
                    // дальше делаем че надо
                }
                else
                {
                    // тут код если GetOwner не сработал
                }
            }

original http://stackoverflow.com/questions/566835/how-to-get-the-user-name-or-owner-of-a-process-in-net/9013685#9013685

Answer 2

Получить все процессы можно так:

        using System.Management;
        ...
        ManagementObjectSearcher Processes = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
        foreach (ManagementObject Process in Processes.Get())
        {
            if (Process["ExecutablePath"] != null)
            {
                string[] OwnerInfo = new string[2];
                Process.InvokeMethod("GetOwner", OwnerInfo);
                string nameProc = Path.GetFileName(Process["ExecutablePath"].ToString());
                string ownerProc = OwnerInfo[0];                  
            }
        }

Оригинал: http://stackoverflow.com/a/300535/7099599

Update 1

В твоем коде можно так (это и есть с помощью Win32 API):

        List<ListViewItem> itemProc = new List<ListViewItem>(); // список процессов с параметрами
        ManagementObjectSearcher Processes = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
        foreach (ManagementObject Process in Processes.Get())
        {
            if (Process["ExecutablePath"] != null)
            {
                row = new ListViewItem(Path.GetFileName(Process["ExecutablePath"].ToString()));
                string[] OwnerInfo = new string[2];
                Process.InvokeMethod("GetOwner", OwnerInfo);
                //сразу добавляем массив параметров
                row.SubItems.AddRange(new string[]
                {
                    (Int64.Parse(Process["VirtualSize"].ToString()) / 1024).ToString(), // память
                    "Работает", // статус
                    Process["SessionId"].ToString(), // id сессии
                    OwnerInfo[0] // имя владельца
                });
                itemProc.Add(row);
            }
        }
        itemProc.RemoveAll(x => x.SubItems[2].Text == "*"); // эта строка вместо всей той второй части с удалением
        LstProc.Items.AddRange(itemProc.ToArray()); // теперь очищенный список itemProc передается в ListView
READ ALSO
Как сдвинуть текст? Listview OwnerDraw

Как сдвинуть текст? Listview OwnerDraw

Добавил иконки, но как теперь сдвинуть текст? Чтобы стало нормальноДобавление иконки:

240
Поиск подходящего компонента в WinForms (С#)

Поиск подходящего компонента в WinForms (С#)

ЗдравствуйтеУ меня такой вопрос: каким образом в C# WinForms можно реализовать компонент разворачивающегося текстового поля

293
Visual Studio Deploy Web API IIS

Visual Studio Deploy Web API IIS

Добрый деньСоздал web API 2 по примеру

197