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

原文: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的官方文档。

时间: 2024-09-20 07:46:04

C# Process.Kill() 拒绝访问(Access Denied) 的解决方案的相关文章

“拒绝访问(Access Denied)”错误的快捷诊断方法

发布ASP.NET或者ASP应用时经常会碰到因为不恰当的NTFS授权引出的问题,这类问题通常调试起来很头痛,要求调试者具有丰富经验.(比如需要了解ASP.NET的进程模型,Shadow Copy可能涉及的目录,以及当ASP只报告一个"resource in use"的错误时,它可能指的是asp在启动的时候装载一个杀毒软件目录下dll文件失败,等等) 我刚刚发现,借助http://www.sysinternals.com/上的一个小工具 filemon 可以大大简化此类问题的调试过程.

VS2010无法启动此程序,拒绝访问。请哪位好心人帮忙解决一下?

问题描述 VS2010无法启动此程序,拒绝访问.请哪位好心人帮忙解决一下? 解决方案 启动vs时以管理员身份运行,删除bin/debug目录,重新生成.编译,运行. 最后实在不行,重新复制代码到vs. 解决方案二: 我会告诉你吗?你点:调试==>附加到进程==>然后选着传输:默认值, 下面的可用进程找到:LOlClient.exe, 点附加, 你把这个编译器放在游戏里面就可以了, TX就检查不出来了!!!!![img=http://forum.csdn.net/PointForum/ui/sc

脚本中出现 window.open() access is denied - 拒绝访问 情况一则及分析_基础知识

也许这个状况有的朋友已经知道了,但我还是把自己的分析思路写下来给其他的朋友参考. 昨天把blog页面另存在,在本地调试和改blog皮肤. 简介: 我想在onload页面加载完时用脚本控制,把Run HTML code, CopyCode, SaveCode这三个按扭动态的添加到css类名为code_textarea的多行文本框里. 状况描述: 在非服务器端(即没有在本地服务器下调试)按扭已经全部出现在多行文本框下,但在调试脚本时(点击Run HTML code),出现拒绝访问...服务器下调试正

IIS “拒绝访问临时目录”的解决方法

今天把博客程序部署到一台阿里云Windows主机上,通过浏览器访问时出现下面的错误: 创建 BlogConfigurationSettings 的配置节处理程序时出错: 拒绝访问临时目录.以其运行 XmlSerializer 的身份"IIS APPPOOL\www.cnblogs.com"没有足够的权限访问临时目录.CodeDom 将使用此进程用于进行编译的用户帐户,因此如果用户对系统临时目录没有访问权限,则将无法编译.使用 Path.GetTempPath() API 可找到临时目录

ASP.NET拒绝访问临时目录的解决方法_实用技巧

今天把博客程序部署到一台阿里云Windows主机上,通过浏览器访问时出现下面的错误: 复制代码 代码如下: 创建 BlogConfigurationSettings 的配置节处理程序时出错: 拒绝访问临时目录.以其运行 XmlSerializer 的身份"IIS APPPOOL\www.cnblogs.com"没有足够的权限访问临时目录.CodeDom 将使用此进程用于进行编译的用户帐户,因此如果用户对系统临时目录没有访问权限,则将无法编译.使用 Path.GetTempPath()

ASP.net hash.web 拒绝访问问题

asp.net|web|访问|问题|asp.net|问题 在visual studuo.net中调试 asp.net程序时出现过多次"hash.web"访问被拒绝的情况,查看程序代码又没有发现问题,重启IIS也不能解决,唯有重启电脑才恢复正常. 通过百度找不到解决办法,唯有用google搜索一下外国网站,找到如下tips: http://blogs.wwwcoder.com/deepak/archive/2004/10/14/885.aspxAccess to the path con

ASP.NET 拒绝访问

asp.net|访问 使用MICROSOFT的com组件编写插入数据到EXCEL然后再下载到客户机本机程序,在开发时测试通过,上传到WIN2000服务器上后出现如下错误:  Server Error in '/Webqr' Application. --------------------------------------------------------------------------------拒绝访问. Description: An unhandled exception occ

Win8安装蓝牙驱动遇到“拒绝访问”问题的解决方法

  最近,打算在安装了 Windows 8 的台式机上使用蓝牙鼠标,因此把公司送的迷你蓝牙接收器插到USB接口,本以为直接就可以使用了,却半天没有任何反应,只闻设备插拔的叮咚声. 小提示:以下图片如看不清楚,可以点击图片放大! 打开设备管理器,发现蓝牙接收器驱动根本就没有撞上,显示为未知设备: 这个接收器几个月前曾经在这台电脑上使用过,应该不会有什么问题的,而且 Windows 8 对蓝牙的支持肯定是不错的,就算没有内置驱动,在连接上互联网之后,也可以通过 Windows 更新网站获得额外的驱动

ERROR 1045 (28000): Access denied for user &amp;#39;root&amp;#39;@&amp;#39;localhost&amp;#39; (using password: YES)

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) root@mysql ~]# mysql -p -u root Enter password:  ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ERROR 1045 (28000): Access denied