zoukankan      html  css  js  c++  java
  • 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 + "程序已重启!");
                    }

    调试:

    System.ComponentModel.Win32Exception: 异常中可以看到,Kill()进程的时候出现"拒绝访问",在网上搜了下,解决方案大致就这几种:

    1. 在config里增加identity
      • <system.web>
          <identity impersonate="true" userName="Administrator" password="123456" />
        </system.web> 
    2. 检测程序用"管理员身份运行"
    3. 对监测的程序目录分配权限

    结果是这几种方式都没能解决此问题。

    我查看了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的官方文档。

  • 相关阅读:
    【流量劫持】SSLStrip 终极版 —— location 瞒天过海
    【流量劫持】沉默中的狂怒 —— Cookie 大喷发
    【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
    Web 前端攻防(2014版)
    流量劫持 —— 浮层登录框的隐患
    流量劫持能有多大危害?
    流量劫持是如何产生的?
    XSS 前端防火墙 —— 整装待发
    XSS 前端防火墙 —— 天衣无缝的防护
    XSS 前端防火墙 —— 无懈可击的钩子
  • 原文地址:https://www.cnblogs.com/tonge/p/4434322.html
Copyright © 2011-2022 走看看