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

  • 问题

  • 新手刚接触 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()
    ......

    新手问题,希望高手解答,谢谢!
    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()
    ......

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


    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
    • 已标记为答案 flyaway 2009年6月1日 2:44
    2009年5月31日 9:00
    版主

全部回复

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


    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年5月31日 8:41
    版主
  • 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:47
    版主
  • 有 Try Catch,弹出的异常就是:拒绝访问。
    2009年5月31日 8:49
  • 新手刚接触 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
    • 已标记为答案 flyaway 2009年6月1日 2:44
    2009年5月31日 9:00
    版主
  • 多谢楼上兄弟的回复,回去测试一下。
    2009年5月31日 9:12