Проверьте, запущен ли процесс для текущего пользователя в 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!");
}
Но это не работает. (Он показывает только процессы пользователя).