2011-12-08 347 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進程中工作。