1

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

使用此处描述的方法,我已成功将WindowsIdentity.GetCurrent().NameASPNET 更改为我的域帐户。

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

这是它失败的代码:

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

它在删除呼叫上失败。

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

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

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

异常详情:

System.ComponentModel.Win32Exception:访问被拒绝

在完全信任下运行。

4

2 回答 2

2

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

于 2009-01-30T00:22:33.000 回答
1

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

我不确定您为什么要使用 Win32 API 调用来进行模拟 - 自从我弄乱它已经有一段时间了,但我认为您需要做的就是使用

WindowsIdentity.GetCurrent().Impersonate()

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

Impersonate() 方法

于 2009-01-30T00:17:29.547 回答