调用以下代码时,.NET问题访问被拒绝。我想使用System.Diagnostics库获取有关进程的信息。
Process[] processes = Process.GetProcessesByName("MyProcess");
if (processes.Any())
{
var process = processes[0];
// Access is denied
var startTime = process.StartTime;
}
上面的代码是IIS 10(到目前为止全部在本地)上运行的ASP.NET MVC Core 2.2服务的HttpGet方法的一部分。我正在使用System.Diagnostic.Process 4.3.0。
将IIS Apppool添加到本地管理员组没有帮助。考虑到该属性的文档指出Process类包含一个链接需求,并且“当直接调用者或派生类没有完全信任权限时,会引发SecurityException”,这是有道理的。问题是我不了解如何在.net核心Web应用程序中提供完全信任,并且我还没有找到有关链接需求的任何好例子。是否在web.config中-我认为哪一部分会早于.net核心?
我感兴趣的过程是同一解决方案中的窗口控制台应用程序,但由Windows调度程序启动。
我希望获取Process.StartTime,但是获取访问被拒绝。但是,我的安全配置中缺少某些内容。
因此,假设IIS AppPool是HttpGet的执行者,而另一个进程(Windows控制台应用程序)正在独立运行,那么我如何配置安全性以启用对Process.StartTime的成功调用?
PS-我已经尝试过该方法上的[SecurityCritical]注释-没有成功。
答案 0 :(得分:0)
在IIS中,您可以设置站点用来以指定用户身份运行的应用程序池。
在任务计划程序中,您还可以将控制台应用程序设置为以指定用户身份运行。
我建议以同一用户身份运行它们。
我将为控制台应用程序所在的文件夹上的应用程序池用户授予完全权限。
您需要将“应用程序池”用户添加到“性能日志用户”组和/或“性能计数器用户”组(取决于他们是否仅需要读取特权)。我本来希望使该用户成为管理员可以解决您的问题,但事实并非如此。 (我建议您也通读this very similar question)
PS-默认情况下,您不再具有web.config,但仍可以将其添加到项目中并具有许多用途(例如,使用Visual Studio中的一键发布时配置IIS站点设置)。