【问题标题】:Process.MainModule Access Is DeniedProcess.MainModule 访问被拒绝
【发布时间】:2014-09-23 16:34:01
【问题描述】:

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

该进程托管多个服务,我正在尝试访问其中一项服务的 WorkingSet64。当我调用 System.Diagnostics.Process.GetProcessByName() 时,为提供的名称返回 4 个进程,当我遍历这些进程并访问 Process.MainModule.Filename 时,我收到“拒绝访问”错误。

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

我在几个地方看到过这个问题,但大多数答案都建议用 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();

    }
}

谢谢

【问题讨论】:

  • 只要您迭代 GetProcesses(),您就可以保证失败。你必须有选择性地避免那些你永远无法访问的东西。使用 WCF 的目的是永远不必这样做。
  • 我不确定为什么将其标记为关闭,很清楚要求的是什么并且它不是“广泛的”。用户想要获取当前运行的所有进程,但服务权限不够高,他被拒绝访问。如果没有为服务创建特定的管理员用户来运行,我不知道你将如何解决这个问题......
  • 解决它的唯一方法是使用管理员权限运行服务。这就是访问控制的重点......

标签: c# memory process system.diagnostics


【解决方案1】:

我很欣赏访问控制这一点,我只是想知道是否有人对如何更好地实施这一点有任何明智的建议,以便我可以访问我需要的信息。

最后,我实现了一个内部 windows 服务,我可以使用我想要访问的服务进程信息的名称来调用它,诀窍是这个内部服务以与我们其他内部进程相同的访问权限运行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2021-03-06
    • 2011-05-15
    • 2010-09-06
    • 2014-03-22
    • 2013-08-10
    • 2018-04-20
    相关资源
    最近更新 更多