2

我在获取权限以允许我的应用程序(在 IIS7 AppPool 中运行)删除/添加性能计数器类别及其数据时遇到问题。我有这样的代码:

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 应用程序池启用性能计数器类别编辑的完整说明?

4

3 回答 3

1

您应该在 ASP.NET 之外创建性能计数器。创建性能计数器类别需要默认 AppPoolIdentity 帐户没有的权限。一旦创建了自定义性能计数器,ASP.NET 帐户就可以读取它们。(不要将 ASP.NET 作为系统或管理帐户运行,因为这样做会带来安全风险)

您可以在设置过程中创建您的计数器。

于 2012-09-25T08:49:22.080 回答
1

只能使用管理员权限更改性能计数器类别。

请参阅:性能计数器抛出 SecurityException

MSDN 文档包括在安装期间创建它们的另一个原因:

强烈建议在应用程序安装期间而不是在应用程序执行期间创建新的性能计数器类别。这允许操作系统有时间刷新其注册的性能计数器类别列表。如果列表尚未刷新,则使用该类别的尝试将失败。

于 2012-09-26T09:26:55.103 回答
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

于 2012-09-27T01:10:25.013 回答