10

我很难确定增加性能计数器所需的权限。尝试在计数器上调用 .Increment 时,我只发生了一次 InvalidOperationException/Access Denied(我认为)。这导致我得到以下信息:

http://support.microsoft.com/kb/555129

将更新性能计数器的 ASP.NET 应用程序移动到生产环境中的最大问题是权限。默认情况下,为了增加性能计数器,用户需要具有管理员或高级用户权限。

从那里我将用户添加到高级用户组并继续我的方式没有问题。后来我发现“高级用户”不再具有 Vista 之外的任何权限,这让我回到了同一篇文章:

幸运的是,考虑到这些替代方案,事实证明更新性能计数器所需的权限集比以管理员或高级用户身份运行要小得多。在注册表项 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib 中,设置访问控制列表,以便必要的用户拥有完全控制权。在我们最初的示例中,ASPNET 用户将被授予完全控制权,但可以将访问权限授予需要更新性能计数器的任何人。

但即使这似乎也不是真的,因为我现在已经返回并从高级用户组中删除了我的测试用户,并且我的应用程序仍在毫无问题地递增计数器。

此外,似乎如果要设置权限,它将位于 HKLM\System\CurrentControlSet\services\ 下的个人计数器上。

我完全承认我的代码可能存在其他问题,导致我最初的权限问题。但是,我需要将其一直部署回 XP,因此确认以上内容是否只是过时的信息或完全不正确对我来说很重要。我很快就能自己确认这一点,但如果有人可以验证信息或向我指出具体的文档,那就太好了。

4

1 回答 1

0

这里有两种类型的权限:

  1. 修改性能计数器类别的权限

  2. 通过 .NET 代码调用修改性能计数器的权限

对于第一个,您只需要修改注册表项 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib 的权限(=手动添加或将用户添加到性能日志用户等)以及普通用户拥有的其他一些东西(例如访问 HKLM\SYSTEM\CurrentControlSet\Services),如 KB 中所述。

第二个与代码访问安全(CAS)策略有关。CAS 策略曾经/现在是一种机制,用于确定执行代码是否具有操作权限(通常在资源上,例如文件系统或性能计数器),如果没有,则抛出 SecurityExeption。由于各种原因, CAS 策略自 .NET 4 以来已过时(例如,除了 .NET 代码之外还有本机 Win32 API)。

如果您想了解 CAS 策略,这是一篇不错的文章:Understanding .NET Code Access Security

启用 CAS 后,可以创建有关计算机上运行的代码的策略,并设置它是否可以递增或设置计数器的原始值,或者是否可以引发安全异常(性能计数器的可能权限在PerformanceCounterPermissionAccess中找到)。

基本上,如果你有 .NET 4,你可以忽略 CAS 策略(它已被关闭),以前的版本使用 mscorcfg.msc 检查程序的权限。

于 2016-10-08T12:15:15.060 回答