【发布时间】: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