Узнать системный процесс или нет - C#
Формулировка задачи:
Всем привет! Нашел такую функцию:
Но к сожалению она очень медленно работает если перебираю все процессы через цикл foreach. Возможно существуют методы по лучше и быстрей в плане скорости выполнения функции?
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 "Система"; }
Решение задачи: «Узнать системный процесс или нет»
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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д