2014-09-23 240 views
1

我正在使用System.Diagnostics.Process.GetProcessByName()来访问作为Windows服务运行的wcf服务主机。Process.MainModule访问被拒绝

该进程托管多个服务,我试图访问其中一个服务的WorkingSet64。当我调用System.Diagnostics.Process.GetProcessByName()时,返回4个进程提供的名称,当我通过这些进程循环访问Process.MainModule.Filename时,出现“访问被拒绝”错误。

当我在我的开发机器上运行代码时,它似乎返回我期望的信息(ACL已关闭),当我在服务器上运行代码时(ACL已打开),该进程作为系统进程运行访问被拒绝异常被抛出。

我已经在几个地方看到过这个问题,但大多数答案都建议只用try catch跳过不可访问的项目,这不是我想要的,我需要检查无法访问的项目。下面

代码演示了一个例子:

class Program 
{ 
    static void Main(string[] args) 
    { 

     Process[] service; 
     service = Process.GetProcesses(); 

     Console.WriteLine(service.Count()); 

     foreach (var s in service) 
     { 
      Console.WriteLine(s.ProcessName); 

      try 
      { 
       Console.WriteLine(s.WorkingSet64); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("ERROR---" + ex.Message); 
      } 

      Console.WriteLine("-------------------"); 
     } 

     Console.ReadLine(); 

    } 
} 

感谢

+0

你,只要你迭代GetProcesses在和自己的失败保证()。你必须有选择性地避免那些你永远无法访问的东西。使用WCF的重点是永远不必这样做。 – 2014-09-23 16:38:14

+0

我不确定为什么这会被标记为关闭,很明显是什么被问到,它不是'广泛'。用户希望获取当前正在运行的所有进程,但服务权限不够高,并且他获取了拒绝访问。如果没有为服务创建特定的管理员用户下我唐诺运行你将如何解决这个... – Phill 2014-09-23 16:45:29

+1

的*仅*的方式来解决这个问题是用管理员权限运行服务。这是访问控制的关键...... – 2014-09-23 16:50:03

回答

0

我很欣赏的访问控制的地步,我只是想知道如果任何人对如何更好地实现任何智能建议,这让我可以访问我需要的信息。

最终我实现了一个内部的Windows服务,我可以用我想要访问的服务过程信息的名,诀窍是这个内部服务与同一接入我们的其他内部流程运行。

当我打电话给内部服务时,访问任何其他Windows服务的进程信息都没有问题。