C# IIS7应用程序内WMI自定义性能标记的权限问题

C# IIS7应用程序内WMI自定义性能标记的权限问题,c#,iis-7,wmi,perfmon,C#,Iis 7,Wmi,Perfmon,为了允许我的应用程序(在IIS7应用程序池中运行)删除/添加性能计数器类别及其数据,我在获取权限时遇到问题。我有这样的代码: if (!PerformanceCounterCategory.Exists(CategoryName)) { var counters = new CounterCreationDataCollection(); var opsIn = new CounterCreationData { CounterName = "Test C

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

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

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


您可以在安装过程中创建计数器。

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

见:

包括在安装期间创建它们的其他原因:

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


如果不希望在单独的进程中运行性能计数器代码,则可以通过提升权限执行以下操作

上面的链接解释了ASP.NET应用程序中的性能计数器,以及ASP.NET默认情况下如何没有创建自定义性能计数器的权限以及如何无法读取性能计数器。下面是文章的引文

如果在ASP.NET应用程序中使用PerformanceCounter组件,则ASP.NET用户帐户的默认设置会限制对性能计数器的访问。默认情况下,ASPNET用户帐户可以写入性能计数器,但不能从中读取,并且不能创建新类别。您可以对ASPNET帐户使用模拟来允许创建新类别。模拟标识必须具有足够的权限才能创建类别。如果应用程序需要可在部署前指定的性能计数器,则可以由部署项目创建这些计数器。有关详细信息,请参阅ASP.NET Web应用程序安全

您可以模拟asp作为单独的帐户运行,也可以授予特权。下面是ASP.NET模拟文章中的示例代码,当然您也可以加密此用户名和密码。本文解释了如何加密用户名和密码


这是一个糟糕的问题还是分类错误?我很担心,因为还没有任何回复:)我并没有试图收集这些要点,但如果我理解,你有WMI身份验证问题,对吗?你能添加WMI代码吗?如果您没有全部/足够的权限,请参见此处:是的,WMI身份验证问题。上面的代码是WMI代码,我正在创建WMI性能计数器类别并向其中添加性能计数器。这是我遇到问题的权限(使用计数器不是问题)。我根本没有将WMI用于系统信息,这是我的问题的一部分-几乎所有的信息都使用它,而不是用于性能计数器行为;)据我所知的WMI身份验证代码,这并没有显示任何。您是否尝试过使用简单的WMI身份验证代码以确保不会出现任何错误?我上面的链接包括这样的代码。我建议简单地删除一个测试文件。如果这样做有效,那么可能有一个特定的WMI函数需要更多的身份验证。如果我在安装过程中创建计数器,则在不再次使用该安装过程的情况下无法更改计数器。我不想被锁定在无法在运行时更改的类别中。如果我正确阅读了您的答案,则不可能在不打开安全风险的情况下执行我想执行的操作,因为ASP.NET必须以管理员身份运行,这样做是否准确?为什么ASP需要管理员权限才能更改WMI性能计数器类别?这似乎不合适。这让我觉得我应该积极追求一个平台而不是WMI。这似乎是最好的选择。所讨论的服务器与外部世界隔离,因此至少我可以向我的PM呈现这两种场景(使用模拟创建动态计数器与仅在安装时创建计数器)。WMI支持是一个业务目标,所以我不想放弃它。谢谢