2011-12-08 54 views
7

Tôi muốn xử lý điều này khác nhau, tức là. xác định xem tôi có quyền truy cập hay không.Process.MainModule -> "Truy cập bị từ chối"

Có thể xem bạn có quyền truy cập vào mô-đun chính hay không?

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

Ở đây chúng tôi lại tiếp tục. Có một cái nhìn @ http://stackoverflow.com/questions/2774527/access-denied-while-using-system-diagnostics-process – leppie

Trả lời

3

tôi thấy hai nguyên nhân có thể là ngoại lệ:

  1. Nó có thể là quá trình của bạn là x86 và quá trình này đang được truy vấn là x64 hoặc ngược lại.
  2. Mọi quy trình đều có tên gọi ACL (danh sách điều khiển truy cập) mô tả những người có thể tương tác với nó, các quy trình bạn gặp phải vì lý do bảo mật là ACL trống nên ngay cả với quản trị viên, bạn không thể gây rối với chúng. Ví dụ, có một handfull của các quy trình (audiodg, hệ thống, và nhàn rỗi từ đỉnh đầu của tôi) mà ném một ngoại lệ do quyền truy cập.

Chỉ cần sử dụng thử/nắm bắt vòng lặp của bạn để xử lý các quy trình đó.

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(); 
} 

Sử dụng pinvoke với ProcessAccessFlags.QueryLimitedInformation. Điều này sẽ cho phép bạn lấy tên tệp của quy trình mà không có đặc quyền quản trị đặc biệt và hoạt động trên các quy trình x32 và x64.

Các vấn đề liên quan