Узнать системный процесс или нет - 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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д