我正在尝试创建一个简单的Asp.Net页面,以便从远程计算机上读取Perfmon计数器。
当我使用Visual Studio开发Web服务器运行页面时,一切都很好,但是当我在IIS上托管时尝试运行同一页面时,我在实例化Perfmon计数器的行上得到访问被拒绝错误:
PerformanceCounter freeSpaceCounter = new PerformanceCounter("LogicalDisk", "Free Megabytes", "D:", "RemoteMachine12");
这是我得到的例外:
Exception Details: System.ComponentModel.Win32Exception: Access is denied
我尝试过使用匿名访问(我自己作为匿名用户)和集成Windows身份验证 - 两者都不起作用。显然,其他一些帐户用于读取PerfMon计数器(如ASPNET帐户)。如何使用我的帐户而不是该帐户访问我的页面以访问PerfMon计数器?
答案 0 :(得分:6)
您遇到的问题是IIS在本地帐户的上下文中运行(默认情况下)。远程计算机上不存在此本地帐户,因此无法连接以获取性能计数器。当您使用VS开发Web服务器时,它在您自己的本地帐户下运行,因此一切正常。
如果您在域环境中,则可以将IIS应用程序池配置为可以访问这两台计算机的域帐户运行,一切都可以正常运行,但是您可能需要对此进行更多控制。
您可以使用基本身份验证,将应用程序配置为模拟(或者如果您使用IIS7将池配置为在经过身份验证的帐户下运行),或者在您阅读计数器之前进行模拟。
有两种方式可以模仿 - 最安全的方法是将IIS配置为使用集成身份验证然后打包调用
PerformanceCounter freeSpaceCounter = null;
using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
{
freeSpaceCounter = new PerformanceCounter("LogicalDisk",
"Free Megabytes", "D:", "RemoteMachine12");
}
如果您不想要身份验证,则必须配置应用程序池,或在应用程序中硬编码用户名和密码 - 这应该是最后的选择,请参阅KB306158
答案 1 :(得分:2)
来自MSDN:
要在Windows Vista,Windows XP Professional x64 Edition或Windows Server 2003中读取性能计数器,您必须是Performance Monitor Users组的成员或具有管理权限。