Узнать системный процесс или нет - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Нашел такую функцию:
        static string GetProcessOwner(int processId)
        {
            string query = "Select * From Win32_Process Where ProcessID = " + processId;
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection processList = searcher.Get();
 
            foreach (ManagementObject obj in processList)
            {
                string[] argList = new string[] { string.Empty, string.Empty };
                int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList));
                if (returnVal == 0)
                {
                    // return DOMAIN\user
                    return argList[1] + "" + argList[0];
                }
            }
 
            return "Система";
        }
Но к сожалению она очень медленно работает если перебираю все процессы через цикл foreach. Возможно существуют методы по лучше и быстрей в плане скорости выполнения функции?

Решение задачи: «Узнать системный процесс или нет»

textual
Листинг программы
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);
        static uint TOKEN_QUERY = 0x0008;
 
            foreach (Process p in Process.GetProcesses())
            {
                IntPtr ph = IntPtr.Zero;
                try
                {
                    OpenProcessToken(p.Handle, TOKEN_QUERY, out ph);
                    WindowsIdentity wi = new WindowsIdentity(ph);
                    Console.WriteLine("Process {0} owned by {1} (isSystem {2})", p.ProcessName, wi.Name, wi.IsSystem);
                }
                catch (Exception xcp)
                {
                    Console.WriteLine(p.ProcessName + ": " + xcp.Message);
                }
                finally
                {
                    if (ph != IntPtr.Zero)
                    {
                        CloseHandle(ph);
                    }
                }
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы