Окружающая среда - C#, .net 4.0, VS 2010Как определить, выполняется ли процесс для текущего пользователя в системе?
Здравствуйте, я написал простую замену оболочки для Windows. Оболочка запускается автоматически, когда пользователь входит в систему. Обычный Windows «explorer.exe» запускается, когда пользователи выходят из моей оболочки.
Теперь, когда пользователи завершают работу (и для правильной поддержки этого), мне нужно проверить, выполняется ли «explorer.exe» для текущего пользователя в системе. Это предотвращает повторный запуск кода, что приводит к появлению окна приложения «Проводник Windows».
Я видел множество примеров того, как проверить и посмотреть, запущен ли процесс ... но нет, чтобы увидеть, запущен ли он для текущего пользователя.
Код, указанный ниже, будет проверять, есть ли в данный момент файл "explorer.exe" и его запустить, если он не работает. Но бывают ситуации, когда этот код будет проверяться положительно, когда это не нужно!
Например, при использовании быстрого доступа ... Другой пользователь зарегистрировался на машине, и в результате в списке процессов отображается «explorer.exe». Но, несмотря на то, что «explorer.exe» запущен, он не запускается для текущего зарегистрированного пользователя! Поэтому, когда моя оболочка выходит из строя, тесты кода положительны, а «explorer.exe» не запускается. Пользователь остается с черным экраном и без оболочки!
Итак, как я могу изменить код ниже, чтобы проверить, запущен ли «explorer.exe» для текущего пользователя в системе?
Process[] Processes = Process.GetProcessesByName("explorer");
if (Processes.Length == 0)
{
string ExplorerShell = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), "explorer.exe");
System.Diagnostics.Process prcExplorerShell = new System.Diagnostics.Process();
prcExplorerShell.StartInfo.FileName = ExplorerShell;
prcExplorerShell.StartInfo.UseShellExecute = true;
prcExplorerShell.Start();
}
СПАСИБО! Окончательный код: Процесс prcShell = Process.GetProcesses(). FirstOrDefault (pp => pp.ProcessName.StartsWith («Shell»)); Процесс prcExplorer = Process.GetProcesses(). FirstOrDefault (pp => pp.ProcessName == "explorer" && pp.SessionId == prcShell.SessionId); if (prcExplorer == null) { string ExplorerShell = string.Format ("{0} \\ {1}", Environment.GetEnvironmentVariable ("WINDIR"), "explorer.exe"); Процесс prcExplorerShell = new Process(); prcExplorerShell.StartInfo.FileName = ExplorerShell; prcExplorerShell.StartInfo.UseShellExecute = true; prcExplorerShell.Start(); } –