Check if process is running for current user in C#

873 Views Asked by At

I have a program in which I check if the program is already launched or not.

I use:

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;

The check works but the problem is that this doesn't work on a terminal server.

The reason is, is because I check if the process exist in the existing processes.

Example:

If user A is connected to a terminal server and runs program X, user B won't be able to launch the program (because the program X usage of user A will show up in the list)

My question is, how in C#, can I check if the program is already running under the context of the user?

I have discovered the following WMI-code that works in PowerShell, but the problem is that this doesn't work in C#

   $owners = @{ }
            gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
            $ps = get - process | select processname,Id,@{ l = "Owner"; e ={$owners[$_.id.tostring()]} }
            foreach ($p in $ps) {
                if ($p.Owner - eq $env: USERNAME) {
                     $p
                   }
            }

Would there be a method by editing my existing method to allow this?

I tried to do:

            Process[] runningProcesses = Process.GetProcesses();
            var currentSessionID = Process.GetCurrentProcess().SessionId;

            Process[] sameAsThisSession =
                runningProcesses.Where(p => p.SessionId == currentSessionID).ToArray();

            if (sameAsThisSession.Contains(System.Diagnostics.Process.GetCurrentProcess()))
            {
                MessageBox.Show("Program already running!");
            }

But this doesn't work. (It does show the processes of the user only though).

0

There are 0 best solutions below