【问题标题】:Access denied reading Perfmon counters from a remote machine (Asp.Net)访问被拒绝从远程计算机(Asp.Net)读取 Perfmon 计数器
【发布时间】:2010-12-06 15:03:20
【问题描述】:

我正在尝试创建一个简单的 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 计数器?

【问题讨论】:

    标签: asp.net permissions


    【解决方案1】:

    这里的问题是 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

    【讨论】:

    • 谢谢 - 这正是我一直在寻找的答案,辛苦了!
    【解决方案2】:

    来自 MSDN:

    要在 Windows Vista、Windows XP Professional x64 Edition 或 Windows Server 2003 中读取性能计数器,您必须是 Performance Monitor Users 组的成员或具有管理权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2018-01-30
      • 2017-10-25
      相关资源
      最近更新 更多