C# 在C语言的vista/Windows7中以编程方式终止进程#

C# 在C语言的vista/Windows7中以编程方式终止进程#,c#,windows-vista,process,kill,C#,Windows Vista,Process,Kill,我想在vista/Windows7中以编程方式终止一个进程(我不确定这两个版本之间的UAC实现是否存在重大问题) 现在,我的代码如下所示: if(killProcess){ System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName"); // Before starting the new process make sure

我想在vista/Windows7中以编程方式终止一个进程(我不确定这两个版本之间的UAC实现是否存在重大问题)

现在,我的代码如下所示:

  if(killProcess){
      System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName");
       // Before starting the new process make sure no other MyProcessName is running.
        foreach (System.Diagnostics.Process p in process)
        {
            p.Kill();
        }

        myProcess = System.Diagnostics.Process.Start(psi);
   }
我必须这样做,因为我需要确保如果用户使程序崩溃或突然退出,则在应用程序重新启动时重新启动此辅助进程,或者如果用户希望更改此辅助进程的参数

该代码在XP中运行良好,但在Windows7(我假设在Vista中也是如此)中失败,并显示“访问被拒绝”消息。根据全能的谷歌告诉我的,我需要以管理员的身份运行杀戮程序来解决这个问题,但这只是一个弱点。另一个可能的答案是使用LinkDemand,但我不理解LinkDemand的msdn页面,因为它涉及流程


我可以将代码移动到一个线程中,但这有一大堆其他固有的困难,我真的不想发现。

你是对的,因为你没有管理特权。您可以通过在本地系统用户下安装服务并根据需要对其运行自定义命令来解决此问题

在windows窗体应用程序中:

private enum SimpleServiceCustomCommands { KillProcess = 128 };

ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "SERVICE_NAME");
scp.Assert();
System.ServiceProcess.ServiceController serviceCon = new System.ServiceProcess.ServiceController("SERVICE_NAME", Environment.MachineName);
serviceCon.ExecuteCommand((int)SimpleServiceCustomCommands.KillProcess);

myProcess = System.Diagnostics.Process.Start(psi);
为您服务:

private enum SimpleServiceCustomCommands { KillProcess = 128 };

protected override void OnCustomCommand(int command)
{
    switch (command)
    {
        case (int)SimpleServiceCustomCommands.KillProcess:
            if(killProcess)
            {
                System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName");
                // Before starting the new process make sure no other MyProcessName is running.
                foreach (System.Diagnostics.Process p in process)
                {
                    p.Kill();
                }
            }
            break;
        default:
            break;
    }
}

我将为Simon Buchan的建议添加代码。假设您的windows窗体首先启动了该过程,那么它是有意义的,并且应该也可以工作

这里是创建流程的地方。注意变量myProc。这是你的把柄:

System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.EnableRaisingEvents=false;
myProc.StartInfo.FileName="PATH_TO_EXE";
myProc.Start();
稍后,用以下方法杀死它:

myProc.Kill();

Kill()对我来说似乎工作得很好,无论是对于由explorer创建的进程还是同一个应用程序。在有限用户环境下运行Vista。那可能只是Windows7的一个bug?你能在回答中写下你的密码吗?因为这让我很困惑。这是一个解决方案,而且可能是正确的。我得调查一下;我没有服务方面的经验,但将此流程称为与应用程序一起运行的服务可能是正确的。这是我所知道的唯一一种在用户没有收到恼人的UAC提示的情况下完成此任务的方法。幸运的是,为了实现这一点,您不必了解任何有关服务的信息(安装服务除外)。VS模板与我给你添加的代码将完美地工作。是的,这是一条路要走。谢谢你的帮助!但问题是,该应用程序可能意外死亡,或者用户主动自杀。我希望流程只删除由应用程序的另一个实例启动的流程的其他实例。那么服务方法可能是您最好的(唯一?)解决方案。