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

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

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

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

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

textual
Листинг программы
  1.         [DllImport("advapi32.dll", SetLastError = true)]
  2.         static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);
  3.         [DllImport("kernel32.dll", SetLastError = true)]
  4.         [return: MarshalAs(UnmanagedType.Bool)]
  5.         static extern bool CloseHandle(IntPtr hObject);
  6.         static uint TOKEN_QUERY = 0x0008;
  7.  
  8.             foreach (Process p in Process.GetProcesses())
  9.             {
  10.                 IntPtr ph = IntPtr.Zero;
  11.                 try
  12.                 {
  13.                     OpenProcessToken(p.Handle, TOKEN_QUERY, out ph);
  14.                     WindowsIdentity wi = new WindowsIdentity(ph);
  15.                     Console.WriteLine("Process {0} owned by {1} (isSystem {2})", p.ProcessName, wi.Name, wi.IsSystem);
  16.                 }
  17.                 catch (Exception xcp)
  18.                 {
  19.                     Console.WriteLine(p.ProcessName + ": " + xcp.Message);
  20.                 }
  21.                 finally
  22.                 {
  23.                     if (ph != IntPtr.Zero)
  24.                     {
  25.                         CloseHandle(ph);
  26.                     }
  27.                 }
  28.             }

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


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

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

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы