Проверьте, запущен ли процесс для текущего пользователя в C#

У меня есть программа, в которой я проверяю, запущена программа или нет.

Я использую:

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

Проверка работает, но проблема в том, что это не работает на терминальном сервере.

Причина в том, что я проверяю, существует ли процесс в существующих процессах.

Пример:

Если пользователь A подключен к терминальному серверу и запускает программу X, пользователь B не сможет запустить программу (поскольку использование программой пользователя X пользователя A отобразится в списке)

У меня вопрос, как в C# я могу проверить, если программа уже запущена в контексте пользователя?

Я обнаружил следующий WMI-код, который работает в PowerShell, но проблема в том, что он не работает в 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
                   }
            }

Будет ли метод путем редактирования моего существующего метода, чтобы позволить это?

Я пытался сделать:

            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!");
            }

Но это не работает. (Он показывает только процессы пользователя).

0 ответов

Другие вопросы по тегам