Una delle mancanze della classe “Process” è quella di non esporre la proprietà “Owner”, per cui risulta difficile ottenere una lista dei processi di un utente.
Nel caso di Terminal-Service, o di FastUser-Switch se si chiede una lista dei processi attivi si ottengono anche quelli degli altri utenti collegati.
Per risolvere il problema il metodo migliore che ho trovato è quello di ricorrere a WMI (per cui occhio alle prestazioni)
Ecco un esempio:
public class MyProcess : Process
{
public static List<Process> GetMyProcessesByName(string procName)
{
Process[] ps = Process.GetProcessesByName(procName);
List<Process> psRet = new List<Process>();
foreach (Process p in ps)
{
if (IsMyProcess(p))
psRet.Add(p);
}
return psRet;
}
public static string GetProcessOwner(Process process)
{
string select = string.Format("Select * From Win32_Process Where ProcessID = {0}", process.Id);
ManagementObjectSearcher search = new ManagementObjectSearcher(select);
ManagementObjectCollection processList = search.Get();
foreach (ManagementObject obj in processList)
{
string[] args = new string[] { string.Empty };
int ret = Convert.ToInt32(obj.InvokeMethod("GetOwner", args));
if (ret == 0)
{
return args[0];
}
}
return string.Empty;
}
public static bool IsMyProcess(Process process)
{
string owner = GetProcessOwner(process);
return (String.Compare(owner, Environment.UserName, true) == 0);
}
}
E come utlizzarlo:
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Tutti i processi 'SampleApp'");
List<Process> ps = MyProcess.GetProcessesByName("SampleApp").ToList();
foreach (Process p in ps)
{
Console.WriteLine(p.Id);
}
Console.WriteLine("");
Console.WriteLine("I miei processi 'SampleApp'");
ps = MyProcess.GetMyProcessesByName("SampleApp");
foreach (Process p in ps)
{
Console.WriteLine(p.Id);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}