Узнать системный процесс или нет - 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);
}
}
}