即使具有管理员权限,Process.kill()在Windows 7 32位中被拒绝

时间:2010-08-15 10:30:19

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

大家好。

我遇到了一个奇怪的问题。我的应用程序有一个简单的方法,如果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>

之前有人遇到过同样的问题吗?我怎样才能纠正这个奇怪的问题。

由于

4 个答案:

答案 0 :(得分:9)

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

System.Diagnostics.Process.Kill

  
    

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

  

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

答案 1 :(得分:5)

您是否将代码包装在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);
}

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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