2011-12-08 300 views
7

我想处理这个不同, 即。确定我是否有权访问。Process.MainModule - >“访问被拒绝”

是否可以查看您是否可以访问主模块?

foreach (Process p in Process.GetProcesses()) 
     { 
      try 
      { 
       //This throws error for some processes. 
       if (p.MainModule.FileName.ToLower().EndsWith(ExeName, StringComparison.CurrentCultureIgnoreCase)) 
      { 
       //Do some stuff 
      } 

      } 
      catch (Exception) 
      { 
       //Acess denied 
      } 
     } 
+2

这里我们再次去。看看@ http://stackoverflow.com/questions/2774527/access-denied-while-using-system-diagnostics-process – leppie

回答

3

我看到异常的两个可能的原因:

  1. 这可能是因为你的过程是x86和过程被查询支持x64或反之亦然。
  2. 每个进程都有一个所谓的ACL(访问控制列表),描述谁可以与之交互,出于安全考虑,您遇到问题的进程具有空ACL,因此即使管理员不能混淆它们。例如,由于访问权限,处理过程(从头顶开始的audiodg,System和Idle)会引发异常。

只需使用try/catch循环来处理这些过程。

1
[Flags] 
    private enum ProcessAccessFlags : uint 
    { 
     QueryLimitedInformation = 0x00001000 
    } 

    private static extern bool QueryFullProcessImageName(
     [In] IntPtr hProcess, 
     [In] int dwFlags, 
     [Out] StringBuilder lpExeName, 
     ref int lpdwSize); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern IntPtr OpenProcess(
    ProcessAccessFlags processAccess, 
    bool bInheritHandle, 
    int processId); 

String GetProcessFilename(Process p) 
{ 
int capacity = 2000; 
StringBuilder builder = new StringBuilder(capacity); 
IntPtr ptr = OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, p.Id); 
if (!QueryFullProcessImageName(ptr, 0, builder, ref capacity)) 
{ 
    return String.Empty; 
} 

return builder.ToString(); 
} 

使用的PInvoke与ProcessAccessFlags.QueryLimitedInformation。这将允许您获取进程的文件名,而不需要特殊的管理员权限,并且可以在x32和x64进程中工作。