• (转载)C# Process.Kill() 拒绝访问(Access Denied) 的解决方案


    需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那。。。?

     
     
     
    解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常,但是进程还在,这个时候就Kill掉这个进程,重启后台计算程序,这里的计算程序均为"控制台运行程序"。
     
     
     
    代码如下:
     
     
       if (进程是否挂掉)
                    {
                        // 获取所有进程
                        Process[] ps = Process.GetProcesses();
                        for (int i = 0; i < ps.Length; i++)
                        {
                            if (ps[i].ProcessName.StartsWith(“ProcessName"))
                            {
                                // 统计崩溃计数
                                CrashCount(obj.Name);
                                ps[i].Kill();
                            }
                        }
                        Process.Start(Path);
                        Console.WriteLine(ProcessName + "程序已重启!");
                    }
     
     
     
     
     
     
     
    异常中可以看到,Kill()进程的时候出现"拒绝访问",在网上搜了下,解决方案大致就这几种:
     
    在config里增加identity
    <system.web>
      <identity impersonate="true" userName="Administrator" password="123456" />
    </system.web> 
    检测程序用"管理员身份运行"
    对监测的程序目录分配权限
    结果是这几种方式都没能解决此问题。
     
     
     
    我查看了Kill()方法的注释:
     
     
     //
            // 摘要: 
            //     立即停止关联的进程。
            //
            // 异常: 
            //   System.ComponentModel.Win32Exception:
            //     未能终止关联的进程。 - 或 - 正在终止该进程。 - 或 - 关联的进程是一个 Win16 可执行文件。
            //
            //   System.NotSupportedException:
            //     您正尝试为远程计算机上运行的进程调用 System.Diagnostics.Process.Kill()。 该方法仅对在本地计算机上运行的进程可用。
            //
            //   System.InvalidOperationException:
            //     该进程已经退出。 - 或 - 没有与此 System.Diagnostics.Process 对象关联的进程。
            public void Kill();
     
    发现是一个Win32Exception的异常,随后我又查阅了ms的官方文档,果然有发现:
     
    大概意思就是说如果这个监测程序是Console,這样写是没问题的,可以正常结束掉进程。但这里因为需要在界面上展现出一些监测数据,这里我用的是WPF,也就是文档里说的图像界面程序。
     
    MS的原话是这样的:如果调用 Kill,则可能丢失进程编辑的数据或分配给进程的资源。Kill 导致进程不正常终止,因而只应在必要时使用。CloseMainWindow 使进程能够有序终止并关闭所有窗口,所以对于有界面的应用程序,使用它更好。如果 CloseMainWindow 失败,则可以使用 Kill终止进程。Kill 是终止没有图形化界面的进程的唯一方法。
     
    将Kill方法()改成了CloseMainWindow()即可正常杀掉进程。
     
    以上就是这两天碰到的一个异常,让我总结出了一个新的结论,在遇到问题的时候,不要盲目的去google或百度,应该首先去查阅ms的官方文档。
  • 相关阅读:
    图像的不变性及解决手段
    007 Go语言基础之流程控制
    008 Go语言基础之数组
    006 Go语言基础之运算符
    004 Go语言基础之变量和常量
    019 Python实现微信小程序支付功能
    018 Python玩转微信小程序
    017 python--微信小程序“跳一跳‘外挂
    016 用python一步一步教你玩微信小程序【跳一跳】
    025 nginx之日志设置详解
  • 原文地址:https://www.cnblogs.com/Maculish/p/5032417.html
Copyright © 2020-2023  润新知