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();
    }
}