【问题标题】:Can ASP.NET Impersonate a user to Delete a Performance Counter Category?ASP.NET 可以模拟用户删除性能计数器类别吗?
【发布时间】:2010-10-04 09:19:51
【问题描述】:

我相信我在本地计算机上运行 ASP.NET 页面时成功模拟了自己的用户帐户。

使用here 描述的方法,我已经成功地将WindowsIdentity.GetCurrent().Name 从 ASPNET 更改为我的域帐户。

我可以成功写入文件系统上只有我的帐户有权访问的文件。但是,当我尝试删除性能计数器类别时,我得到 Access Denied
我对注册表的分支进行了审核,它告诉我 MyMachine\ASPNET 在对象访问时失败

这是失败的代码:

if ( PerformanceCounterCategory.Exists ( PerfmonCategory ) )
        PerformanceCounterCategory.Delete ( PerfmonCategory );

删除调用失败。

(我的帐户是管理员,我可以在 ASP.NET 上下文之外成功运行相同的代码)。

我怀疑这个 System.Diagnostics 命名空间调用实际上是在调用某个 COM 进程,并且不知何故因为第二跳而被退回。谁能确认会发生什么?

编辑: 例外: 访问被拒绝 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情:

System.ComponentModel.Win32Exception:访问被拒绝

在完全信任的情况下运行。

【问题讨论】:

  • 粘贴抛出的异常怎么样,如果你在部分信任下运行,我敢打赌这是一个 CAS 异常

标签: asp.net permissions impersonation performancecounter


【解决方案1】:

您可以在自己的应用程序池上运行您的应用程序(总是一件好事),并为服务用户分配适当的权限,这样您就不需要弄乱模拟了。

【讨论】:

  • 授予应用程序池管理员权限有点可怕,您不觉得吗?此外,我怀疑它是否会一直都需要这些权限,所以最好只在需要时提升。
  • 愚蠢的问题 - 你为什么要在你的网络应用程序中创建/删除 categories c?我以为你会创建计数器的 instances
  • 因为在这种情况下,我在本地开发环境中运行,性能计数器是在 web.config 中配置的。当应用程序安装到共享开发、QA 或生产时,安装程​​序会负责创建计数器。我想让它在本地开发环境中易于使用。
  • 那么赋予应用程序池管理员权限看起来并没有那么可怕 - 它只是开发人员,所以也许没有什么危害......
【解决方案2】:

您确实需要成为管理员才能添加或删除性能计数器。

我不确定你为什么要使用 Win32 API 调用来进行模拟 - 我已经有一段时间没有搞砸了,但我认为你需要做的就是使用

WindowsIdentity.GetCurrent().Impersonate()

需要明确的是,您首先需要使用 Windows 身份验证在您的 Web 应用程序中进行身份验证,然后您应该能够调用 Impersonate()。

Impersonate() Method

【讨论】:

  • 实际上你仍然需要所有可爱的 Win32 API 调用来获得正确的登录令牌:WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken) msdn.microsoft.com/en-us/library/chf6fbt4.aspx
  • 我认为您不需要 logonToken...这就是为什么存在无参数重载的原因。
  • 我实际上已经模拟了两种方式,但效果没有任何变化。
  • 我知道模拟正在工作,因为我可以使用受限权限写入文件。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多