C#终止所有对运行Windows不重要的进程

时间:2011-02-21 22:17:51

标签: c# windows-7 dangerous-request

我有一个申请。如果应用程序未在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 个答案:

答案 0 :(得分:4)

首先,在公共电脑上设置自动登录。

然后,您的程序必须重新启动。

如果您设置steady state或使用Deep FreezeSystem SafeTime Freeze等产品,则可获得积分。这些产品甚至可以选择在一段时间不活动后将计算机重新启动到干净的状态......

答案 1 :(得分:3)

这里最安全的方法是保留应用程序启动时存在的进程列表,并将其排除在kill之外。但是,根据应用程序何时启动(例如,如果它不是系统启动的一部分),这可能会让某些应用程序漏掉。从好的方面来说,它将允许设备(例如鼠标和键盘处理程序)的用户模式挂钩继续运行,这意味着在您杀死所有内容后系统仍然可用。

您可以尝试broadcasting WM_CLOSE消息,但如果Windows阻止它,我也不会感到惊讶。它只对具有可见窗口的进程产生影响,但这可能就足够了。

第三个选项是强制注销ExitWindowsEx,让操作系统处理关闭所有内容。当然,这也将关闭您自己的应用程序并强制用户再次登录。如果您设置了自动登录,则可以直接登录。

答案 2 :(得分:1)

你显然正在杀死Windows运行所需的重要进程。如果你杀了那些,Windows无法恢复(正如你已经意识到的那样)并且需要重新启动。

答案 3 :(得分:1)

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();
    }                          
}

这似乎有效。