我在获取权限时遇到问题,以便允许我的应用程序(在IIS7 AppPool中运行)删除/添加Performance Counter Categories及其数据。我有这样的代码:
if (!PerformanceCounterCategory.Exists(CategoryName))
{
var counters = new CounterCreationDataCollection();
var opsIn = new CounterCreationData
{
CounterName = "Test Counter",
CounterHelp = "Test Counter Help",
CounterType = PerformanceCounterType.RateOfCountsPerSecond32
};
counters.Add(opsIn);
PerformanceCounterCategory.Create(CategoryName, "Service Layer Instrumentation",
PerformanceCounterCategoryType.SingleInstance,
counters);
}
目的是在尚未创建性能计数器的系统上创建性能计数器,因此我不会受到静态安装程序行为的限制(我希望能够在没有大量工作的情况下更改计数器)。到目前为止,当它工作时,它运作良好。
当我在可执行文件中运行此代码时,作为管理员,没有问题。但是,当我在IIS服务中运行它时,AppPool没有执行类别更改的正确权限。我知道有一个事实是可以让WMI权限正常工作,因为我曾经做过一次带有测试服务器的演示......但那是几个月前,我累了,这是最后一分钟。整件事情模糊不清。我现在无法重现我的结果,我正在尝试将安装过程正式化以包含必要的安全更改。
谷歌只是稍微有所帮助,我清楚地记得,在事情发生之前,必须从几个页面一起大肆宣传。是否有人建议完整说明为IIS应用程序池启用性能计数器类别编辑?
答案 0 :(得分:1)
您应该在ASP.NET之外创建性能计数器。创建性能计数器类别需要默认AppPoolIdentity帐户不具有的权限。 ASP.NET帐户可以在创建后读取自定义性能计数器。 (不要将ASP.NET作为SYSTEM或管理帐户运行,因为这样做会带来安全风险)
您可以在设置过程中创建计数器。
答案 1 :(得分:1)
只能使用管理员权限更改性能计数器类别。
请参阅:Performance counter throws SecurityException
MSDN documentation包含在安装过程中创建它们的其他原因:
强烈建议使用新的性能计数器类别 在安装应用程序期间创建,而不是在安装期间 执行申请。这样可以节省操作时间 系统刷新其注册的性能计数器列表 类别。如果列表尚未刷新,则尝试使用 类别将失败。
答案 2 :(得分:1)
如果您不想在单独的流程中运行性能计数器代码,则可以通过提升权限来执行以下操作。
http://msdn.microsoft.com/en-us/library/bd20x32d(v=vs.71).aspx
上面的链接介绍了ASP.NET应用程序中的性能计数器,以及ASP.NET默认情况下无权创建自定义性能计数器且无法读取性能计数器。以下是文章的引用。
如果在ASP.NET应用程序中使用PerformanceCounter组件,则ASPNET用户帐户的默认设置会限制对性能计数器的访问。默认情况下,ASPNET用户帐户可以写入但不能从性能计数器读取,并且无法创建新类别。您可以使用ASPNET帐户进行模拟,以允许创建新类别。模拟身份必须具有足够的权限才能创建类别。如果您的应用程序需要可在部署之前指定的性能计数器,则可以由部署项目创建它们。有关更多信息,请参阅ASP.NET Web应用程序安全性。
您可以模拟asp作为单独的帐户运行,您也可以授予权限。下面是ASP.NET模拟文章中的示例代码,当然您也可以加密此用户名和密码。本文介绍了如何加密用户名和密码。
http://msdn.microsoft.com/en-us/library/aa719560(v=vs.71).aspx