【问题标题】:Process.kill() denied in Windows 7 32bits even with Administrator privileges即使具有管理员权限,Process.kill() 在 Windows 7 32 位中也被拒绝
【发布时间】:2011-03-30 01:21:27
【问题描述】:

大家好。

我遇到了一个奇怪的问题。我的应用程序有一个简单的方法,如果 IE 进入一个没有响应的状态,这个方法会被触发,关闭所有 IE 进程,然后应用程序重新启动它与 IE 的工作。

方法代码:

foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
{
     if (exe.ProcessName.StartsWith("iexplore"))
          exe.Kill();
}

即使使用管理员权限调试我的应用程序,应用程序有时也会成功运行此方法,而有时我会收到错误 Access Denied,即使以管理员身份运行。

我什至编写了自己的清单文件,指定需要以管理员权限执行此应用程序,我认为我做对了。

清单代码:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="Demo.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
    </application>
  </compatibility>
</asmv1:assembly>

以前有人遇到过同样的问题吗?我该如何纠正这个奇怪的问题。

谢谢

【问题讨论】:

    标签: c# .net internet-explorer process privileges


    【解决方案1】:

    鉴于您说您在尝试调用此方法时始终拥有管理权限,以下将解释您遇到间歇性问题的原因:

    System.Diagnostics.Process.Kill:

    如果在进程当前终止时调用Kill 方法,则会抛出Win32Exception 拒绝访问。

    如果您在 Process-Explorer 中的某个条目上快速点击“删除”+“确定”两次,您就会知道我在说什么。

    【讨论】:

    • 你当然是对的。经过2小时的测试,同样的问题没有再次发生。谢谢。
    【解决方案2】:

    您是否将代码包装在 try/catch 块中以查看是否引发了异常?如果没有,请尝试

    try
    {            
        foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())   
        {   
            if (exe.ProcessName.StartsWith("iexplore"))   
                exe.Kill();   
        } 
    }
    
    catch (Win32Exception e)
    {
        Console.WriteLine("The process is terminating or could not be terminated.");
    }
    
    catch (InvalidOperationException e)
    {
        Console.Writeline("The process has already exited.");
    }
    
    catch (Exception e)  // some other exception
    {
        Console.WriteLine("{0} Exception caught.", e);
    }
    

    【讨论】:

    • 谢谢。特别是对于尝试和捕捉..我不知道我可以有不止一个捕捉..愚蠢的我。
    【解决方案3】:

    这是 Internet Explorer 的一个怪癖,它为一个会话启动多个进程。杀死其中一个会导致他们全部退出。您可能会看到“进程已退出”异常。改为这样做:

            foreach (var ie in Process.GetProcessesByName("iexplore")) { 
                try {
                   ie.Kill();
                }
                catch {}
            }
    

    【讨论】:

    • 阿尼回答时我就是这么做的。谢谢。
    【解决方案4】:

    你不应该使用“foreach”来杀死它,并且在两次杀死之间,你需要延迟才能完全杀死进程

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2018-03-27
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多