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()进程的时候出现"拒绝访问",在网上搜了下,解决方案大致就这几种:

  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-11-06 14:36:45

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

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

需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常,但是进程还在,这个时候就Kill掉这个进程,重启后台计算程序,这里的计算程序均为"控制台运行程序". 代码如下: if (进程是否挂掉) { // 获取所有进程 Process[] ps = Process.GetProcesses(); for (int i = 0; i < p

关于mysql的access denied 错误解决方案

mysql -u root -p 按回车,输入密码后提示access denied......ues password YES/NO的错误? 第一步: 这时你需要进入/etc/mysql目录下,然后sudo vim/vi debian.cnf查看里面的用户名和密码,然后使用这个文件中的用户名和密码进入mysql,假如debian.cnf中的用户名为debian-sys-maint,则: mysql -u debian-sys-maint -p按回车,这时需要你输入密码,复制debian.cnf中

java访问数据库被拒绝,不能连接数据库ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)

错误原因:mysql数据库只允许本地ip访问: 解决方法:修改mysql表设置所有ip都可以访问: 登录数据库 使用以下命令: use mysql; grant all privileges on *.* to 'root'@'%' identified by '你的数据库密码'; flush privileges: 查看是否修改成功 select host,user from user; java访问数据库被拒绝,不能连接数据库ERROR 1045 (28000): Access denied

MySQL java连接被拒绝:java.sql.SQLException: Access denied for user &#39;root&#39;@&#39;****&#39; (using password: YES)

java.sql.SQLException: Access denied for user 'root'@'***.**.**.**' (using password: YES) MySQL服务器部署在Linux上,错误中被我隐掉的是我的公网IP. 这是由于"IP为***.**.**.**,名字为root"的用户 没有权限访问数据库 解决办法: 通过Navicat连接数据库,执行下面内容: grant all privileges on *.* to [email protected]

MySQL使用普通用户访问返回ERROR 1698 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39;

这个问题最开始查资料都说要改密码,密码不对.其实不是这个样子都. 解决方法 修改/etc/mysql/my.cnf,添加以下内容 [mysqld] skip-grant-tables 重启mysql服务/etc/init.d/mysql restart 使用mysql -u root连接 执行select user, plugin from mysql.user; 若显示以下结果,请继续:若没有,这篇文章解决不了. +------------------+--------------------

Tomcat8访问管理页面localhost出现:403 Access Denied

问题: 403 Access Denied You are not authorized to view this page. If you have already configured the Manager application to allow access and you have used your browsers back button, used a saved book-mark or similar then you may have triggered the cros

解决mysql“Access denied for user &#39;root&#39;@&#39;localhost&#39;”

解决mysql“Access denied for user 'root'@'localhost'” 分类: linux 2011-01-14 00:23 147547人阅读 评论(3) 收藏 举报 mysqluseraccessmanager数据库system # mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 使用网

解决 SharePoint 2010 拒绝访问爬网内容源错误的小技巧(禁用环回请求的两种方式)

这里有一条解决在SharePoint 2010搜索爬网时遇到的“拒绝访问错误”的小技巧. 首先要检查默认内容访问帐户是否具有相应的访问权限,或者添加一条相应的爬网规则.如果目标资源库是一个SharePoint库,验证一下该帐号是否具有对该SharePoint web应用程序具有至少“完全读取”的权限. 当我在升级上来的SharePoint环境中对我新建的博客URL进行爬网时遇到了这个错误. 这个错误发生在当你运行Windows 2008 R2和SharePoint 2010并且爬网进程试图访问一

连接mysql时提示java.sql.SQLException: Access denied for user &#39;root&#39;@&#39;DESKTOP-N2B2D9A&#39; (using password: YES)

用root连接mysql时提示:访问被拒绝 检查一下mysql server是否开启,发现后台在运行着..  然后查了一下mysql的用户表,发现root只能运行使用本地ip(localhost或者127.0.0.1)进行连接 解决方法:新开一个权限GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'jeffw' WITH GRANT OPTION; 然后查询一下:select * from user; 新开的root的已经开启权限,