C# 终止除访问被拒绝的进程以外的所有进程错误

C# 终止除访问被拒绝的进程以外的所有进程错误,c#,process,C#,Process,我正在尝试用C#创建一个windows应用程序,其功能是,当它运行时,除了它自己的进程之外,所有进程都会被杀死 我使用以下逻辑: 获取所有进程并将它们存储在列表中 创建一个异常列表(包含允许运行的所有进程名称的列表) 将所有正在运行的进程与异常列表进行比较。如果除上述之外的任何进程正在运行,那么它将被终止 但是有一些进程是不允许终止的,例如,访问被拒绝 在这种情况下,将这些进程添加到异常列表中 但问题是,这段代码会运行,并且在一段时间后,屏幕会挂起,应用程序会关闭 这是密码 Process[]

我正在尝试用C#创建一个windows应用程序,其功能是,当它运行时,除了它自己的进程之外,所有进程都会被杀死

我使用以下逻辑:

  • 获取所有进程并将它们存储在列表中
  • 创建一个异常列表(包含允许运行的所有进程名称的列表)
  • 将所有正在运行的进程与异常列表进行比较。如果除上述之外的任何进程正在运行,那么它将被终止 但是有一些进程是不允许终止的,例如,
    访问被拒绝
    在这种情况下,将这些进程添加到异常列表中

    但问题是,这段代码会运行,并且在一段时间后,屏幕会挂起,应用程序会关闭

    这是密码

    Process[] processlist = Process.GetProcesses();
    string[] recProc = { "winlogon", "VCSExpress", "media player.vshost","VCSExpress", "taskmgr", "smss", "csrss", "wininit", "csrss", "services", 
        "lsass", "lsm", "svchost", "winlogon", "WLTRYSVC", "wlanext", "conhost", "BCMWLTRY", 
        "AvastSvc", "spoolsv", "svchost", "AERTSr64", "btwdins", "NitroPDFDriverService", "NLSSRV32",
        "QDLService2kDell", "dwm", "taskhost", "explorer", "RAVCpl64", "AvastUI", "SearchIndexer", 
        "wmpnetwk", "firefox", "bitlord", "IAStorDataMgrSvc", "LMS", "svchost","media player", 
        "UNS", "regsvr32", "Skype", "OSPPSVC", "audiodg", "NitroPDF", "chrome", "AAM Updates Notifier", 
        "mscorsvw", "media player.vshost", "WmiPrvSE", "conhost", "tasklist","regsvr32","RAVCpl64","idle","dwm","conhost"};
    
    List<string> listOfprocess = new List<string>(recProc);
    
    foreach(Process theprocess in processlist)
    {
        int recProclength = listOfprocess.Count;
        int incrementor;
    
        for (incrementor=0; incrementor < processlist.Length;incrementor++)
        {
            if (theprocess.ProcessName != listOfprocess[incrementor])
            {
                try {
                    theprocess.Kill();
                }
                catch(Win32Exception w){
                    listOfprocess.Add(theprocess.ProcessName);
                    incrementor = 0;
                    break;
                }
            }
        }
    }
    
    Process[]processlist=Process.getprocesss();
    字符串[]recProc={“winlogon”、“VCSExpress”、“media player.vshost”、“VCSExpress”、“taskmgr”、“smss”、“csrss”、“wininit”、“csrss”、“services”,
    “lsass”、“lsm”、“svchost”、“winlogon”、“WLTRYSVC”、“wlanext”、“conhost”、“BCMWLTRY”,
    “AvastSvc”、“spoolsv”、“svchost”、“AERTSr64”、“btwdins”、“NitroPDFDriverService”、“NLSSRV32”,
    “QDLService2kDell”、“dwm”、“taskhost”、“explorer”、“RAVCL64”、“AvastUI”、“SearchIndexer”,
    “wmpnetwk”、“firefox”、“bitlord”、“iStorDataMgrsvc”、“LMS”、“svchost”、“媒体播放器”,
    “UNS”、“regsvr32”、“Skype”、“OSPSVC”、“audiodg”、“NitroPDF”、“chrome”、“AAM更新通知程序”,
    “mscorsvw”、“media player.vshost”、“WmiPrvSE”、“conhost”、“tasklist”、“regsvr32”、“RAVCpl64”、“idle”、“dwm”、“conhost”};
    ListListofProcess=新列表(recProc);
    foreach(处理进程列表中的进程)
    {
    int recProclength=listOfprocess.Count;
    int-incrementor;
    for(incrementor=0;incrementor
    除了关于您为什么这样做的明显问题之外,您的逻辑中还有一个错误

    要了解这一点,请设想您的计算机上只运行两个进程,例如explorer.exe和yourapp.exe


    考虑一下当您为explorer.exe输入foreach时会发生什么。在内部for循环中,您可以检查进程的名称(即资源管理器)是否与进程列表[0](=“winlogon”)匹配。因此,如果条件为true,您将在该进程上调用
    Kill()
    。这不是您想要的。

    您显然是想让流程在与列表中的任何项目匹配时继续运行。但是,如果列表中有任何项目不匹配,那么你就是在扼杀它。这是一个问题,因为如果它与第一个匹配,它将与第二个不匹配,然后死亡。如果与第一个项目不匹配,它将死亡,没有机会查看其他项目是否匹配。当然,你也会杀死自己的进程。

    也许你杀死的其中一个进程比你想象的更重要……你正在终止Windows依赖的一切,并希望它继续运行,就像什么都没发生一样……通常我们不会问你程序的原因,但它确实回避了一个问题:为什么需要这样做?你想杀死
    winlogon
    ?你知道那是个可怕的主意。你确定这不是你正在写的病毒吗?