System.ComponentModel.Win32Exception: 拒绝访问。如何解决?

问题

2009年5月31日星期日 上午8:38

新手刚接触 C# 遇到问题,希望得到高手解答:

一小段代码,用于遍历所有进程的所有模块,找到其中的 ABC.DLL 模块。部分代码如下:

public class GetModule

{

public bool GetModule_Name()

{

foreach(Process LiveProc in Process.GetProcesses())

{

ProcessModuleCollection modules = LiveProc.Modules;  //<-- 此行有错误??没有权限?

foreach(ProcessModule BadModule in modules)

{

if(BadModule.ModuleName == "ABC")

return true;

}

}

return false;

}

}

************** 异常文本 **************

System.ComponentModel.Win32Exception: 拒绝访问。

   在 System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)

   在 System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)

   在 System.Diagnostics.ProcessManager.GetModuleInfos(Int32 processId)

   在 System.Diagnostics.Process.get_Modules()

......

新手问题,希望高手解答,谢谢!

全部回复 (5)

2009年5月31日星期日 上午9:00 ✅已答复 | 1 票

新手刚接触 C# 遇到问题,希望得到高手解答:

一小段代码,用于遍历所有进程的所有模块,找到其中的 ABC.DLL 模块。部分代码如下:

public class GetModule

{

public bool GetModule_Name()

{

foreach(Process LiveProc in Process.GetProcesses())

{

ProcessModuleCollection modules = LiveProc.Modules;  //<-- 此行有错误??没有权限?

foreach(ProcessModule BadModule in modules)

{

if(BadModule.ModuleName == "ABC")

return true;

}

}

return false;

}

}

************** 异常文本 **************

System.ComponentModel.Win32Exception: 拒绝访问。

   在 System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)

   在 System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)

   在 System.Diagnostics.ProcessManager.GetModuleInfos(Int32 processId)

   在 System.Diagnostics.Process.get_Modules()

......

新手问题,希望高手解答,谢谢!

class Program
   {
      static void Main(string[] args)
      {
         //Service1 service = new Service1();
         //Console.WriteLine(service.HelloWorld());
         //Console.WriteLine(service.GetFullName("Raymond"));
         //Console.Read();
         Console.WriteLine(GetModuleName("QQ.exe"));

         Console.ReadLine();
      }

      private static bool GetModuleName(string name)
      {
         Console.WriteLine("get module name :"+name);
         {
            foreach (Process LiveProc in Process.GetProcesses())
            {
               try
               {
                  ProcessModuleCollection modules = LiveProc.Modules;
                  foreach (ProcessModule BadModule in modules)
                  {
                     if (BadModule.ModuleName == name)
                     {
                        Console.WriteLine("succeed!"+name);
                        return true;
                     }
                  }
               }
               catch (Exception ex)
               {
                  Console.WriteLine(ex.Message+LiveProc.ProcessName);
                  continue;
               }
            }
            return false;
         }
      }
   }

运行结果:

get module name :QQ.exe
拒绝访问。svchost
拒绝访问。svchost
拒绝访问。csrss
拒绝访问。MsDtsSrvr
拒绝访问。svchost
succeed!QQ.exe
True
努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond


2009年5月31日星期日 上午8:41

有几个进程是不能如此访问的   比如system   idle 你要把这样的进程记下来  然后跳过

紫柔版主的头像真叫萌得一个不行啊。。。。


2009年5月31日星期日 上午8:47

foreach (Process LiveProc in Process.GetProcesses())
{
    try
    {
        ProcessModuleCollection modules = LiveProc.Modules;  //有些是没有权限访问的,做个 try catch
        foreach (ProcessModule BadModule in modules)
        {
            if (BadModule.ModuleName == "ABC") return true;
        }
    }
    catch
    {
        //
    }
}

知识改变命运,奋斗成就人生!


2009年5月31日星期日 上午8:49

有 Try Catch,弹出的异常就是:拒绝访问。


2009年5月31日星期日 上午9:12

多谢楼上兄弟的回复,回去测试一下。