C# убить все процессы, не необходимые для работы Windows
У меня есть приложение. Если приложение не используется в течение 15 минут, оно должно закрыть все другие приложения (принудительное закрытие) и таймер запускается снова. Я не хочу разбивать Windows 7, делая это. Пока у меня есть следующее:
Process me = Process.GetCurrentProcess();
foreach (Process p in Process.GetProcesses())
{
if (p.Id != me.Id
&& p.ProcessName != "winlogon.exe"
&& p.ProcessName != "explorer.exe"
&& p.ProcessName != "System Idle Process"
&& p.ProcessName != "taskmgr.exe"
&& p.ProcessName != "spoolsv.exe"
&& p.ProcessName != "csrss.exe"
&& p.ProcessName != "smss.exe"
&& p.ProcessName != "svchost.exe "
&& p.ProcessName != "services.exe"
)
{
p.Kill();
}
}
К сожалению, окна умирают (синий экран). Можно ли как-нибудь закрыть все процессы для активного использования, тогда, надеюсь, Windows сможет выжить.
4 ответа
if (p.Id != me.Id
&& !p.ProcessName.ToLower().StartsWith("winlogon")
&& !p.ProcessName.ToLower().StartsWith("system idle process")
&& !p.ProcessName.ToLower().StartsWith("taskmgr")
&& !p.ProcessName.ToLower().StartsWith("spoolsv")
&& !p.ProcessName.ToLower().StartsWith("csrss")
&& !p.ProcessName.ToLower().StartsWith("smss")
&& !p.ProcessName.ToLower().StartsWith("svchost")
&& !p.ProcessName.ToLower().StartsWith("services")
&& !p.ProcessName.ToLower().StartsWith("lsass")
)
{
if (p.MainWindowHandle != IntPtr.Zero)
{
p.Kill();
}
}
Кажется, это работает.
Сначала настройте автоматический вход в систему на общедоступном ПК.
Затем ваша программа просто должна перезагрузиться.
Бонусные баллы, если вы устанавливаете устойчивое состояние или используете такие продукты, как Deep Freeze, System Safe или Time Freeze. Эти продукты даже имеют возможность перезагрузить компьютер в чистое состояние после определенного периода бездействия...
Самый простой способ обезопасить себя - это сохранить список тех процессов, которые существовали на момент запуска вашего приложения, и исключить их из списка уничтожения. Однако, в зависимости от того, когда ваше приложение запускается (например, если оно не является частью запуска системы), это может позволить некоторым приложениям проскользнуть через трещины. С другой стороны, это позволит продолжить работу ловушек пользовательского режима для устройств (таких как обработчики мыши и клавиатуры), что означает, что система все еще может использоваться после того, как вы все уничтожите.
Вы можете попробовать транслировать WM_CLOSE
сообщение, хотя я не удивлюсь, если Windows заблокирует его. Это повлияет только на процессы с видимыми окнами, но этого может быть достаточно.
Третий вариант - принудительно завершить сеанс ExitWindowsEx
это позволит ОС обрабатывать закрытие всего. Конечно, это также закроет ваше собственное приложение и заставит пользователя снова войти в систему. Если у вас настроен автоматический вход в систему, он может войти обратно.
Вы убиваете жизненно важные процессы, необходимые для функционирования окон. Если вы убьете их, окна не смогут восстановиться (как вы уже поняли) и должны быть перезагружены.