2011-12-08 13 views
7

मैं इसे अलग-अलग संभालना चाहता हूं, यानी। निर्धारित करें कि मेरे पास पहुंच है या नहीं।प्रक्रिया। मेन मॉड्यूल -> "एक्सेस अस्वीकार कर दी गई है"

क्या यह देखना संभव है कि आपके पास मुख्य मॉड्यूल तक पहुंच है या नहीं?

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

उत्तर

4

यदि यह विंडोज 7 या विस्टा पर केवल उन्नत प्रक्रियाओं के साथ हो रहा है तो आप पहुंच से वंचित त्रुटि प्राप्त किए बिना सीधे जीत एपीआई का उपयोग करके प्रक्रिया पथ प्राप्त कर सकते हैं। ProcessAccessFlags.QueryLimitedInformation साथ

Access denied while getting process path

How to Get Elevated Process Path in .Net

3

मैं अपवाद के दो संभावित कारणों देखें:

  1. हो सकता है कि अपनी प्रक्रिया 86 है और इस प्रक्रिया पूछे जा रहा है 64 या ठीक इसके विपरीत है।
  2. प्रत्येक प्रक्रिया में एक तथाकथित एसीएल (एक्सेस कंट्रोल लिस्ट) है जो बताती है कि कौन इसके साथ बातचीत कर सकता है, सुरक्षा प्रक्रियाओं के लिए जिन प्रक्रियाओं में आपको समस्याएं आ रही हैं, एक खाली एसीएल है, भले ही व्यवस्थापक आप उनके साथ गड़बड़ नहीं कर सकते। उदाहरण के लिए, एक्सेस अधिकारों के कारण अपवाद फेंकने वाली प्रक्रियाओं की एक मुट्ठी भर (ऑडियोओड, सिस्टम, और निष्क्रिय) है।

बस उन प्रक्रियाओं से निपटने के लिए अपने लूप पर प्रयास/पकड़ का उपयोग करें।

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:

इस लिंक देखें। यह आपको विशेष व्यवस्थापक विशेषाधिकारों के बिना प्रक्रिया के फ़ाइल नाम को पकड़ने और x32 और x64 प्रक्रियाओं में काम करने की अनुमति देगा।

संबंधित मुद्दे

 संबंधित मुद्दे