c# - 在 C# 中以编程方式终止 vista/windows 7 中的进程

标签 c# windows-vista process kill

我想在 vista/windows 7 中以编程方式终止进程(我不确定两者之间 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 中运行良好,但在 Windows 7(我假设在 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;
    }
}

关于c# - 在 C# 中以编程方式终止 vista/windows 7 中的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544687/

相关文章:

c# - 始终以管理员身份运行使用 Windows 桌面桥转换的应用程序?

c# - 树莓派上的单声道在共享对象 (.so) 文件的 DLLImport 处抛出 DLLNotFoundException

c# - 为什么序列化类中的 Random 实例会重复生成同一组数字?

c# - Open XML SDK - AddImagePart - 将图像位置从/media 更改为/word/media

windows - 如何从 Windows Vista Complete PC 备份中提取文件?

database - 如何将 pyodbc 连接到 Access (.mdb) 数据库文件

c++ - Windows 7 UAC 提升

c - 如何在我自己的 C shell 中正确等待前台/后台进程?

perl - 如何在 Perl 中触发并忘记一个进程?

java - 如何找到在 java 中启动的进程的进程 ID (pid)?