[EntLibFAQ]“不允许所请求的注册表访问权”的

系统 2306 0

[EntLibFAQ] “不允许所请求的注册表访问权”的解释

Version

Date

Creator

Description

1.0.0.1

2006-5-2

郑昀 @Ultrapower

草稿

 

继续阅读之前,我们假设您熟悉以下知识:

n          Microsoft Enterprise Library June 2005

n          EventLog 和注册表的关系

  [ 现象 ]

首先,这种情况发生在第一次使用 Microsoft Enterprise Library June 2005 的库 ( 不限定是哪一个库,可以是 Caching ,或者 Security) 时,并且你的应用是 Web 应用:

Windows2000 上,你也许会看到错误“ 拒绝对注册表项的访问 ”;

Windows2003 上,你将看到 System.Security.SecurityException: 不允许所请求的注册表访问权。

此种情形,蝈蝈俊在他的《 使用企业库在某些站点会报试图执行安全策略不允许的操作异常的解决方法。 》中已经谈及了。我下面将试图详细说明原因。

[ 分析 ]

比如我的 ASP.NET 构建的 Web 站点中由于用到了 EnterpriseLibrary Caching 库,所以在客户生产环境中部署的时候,当部署完毕,第一次浏览站点时,我们遭遇了这个错误。

 

也许你熟悉 ASP.NET 的这种报错,知道应该用微软 KB329291 来解释 ( http://support.microsoft.com/?scid=kb;zh-cn;329291&spid=810&sid=58 )

KB 信息

症状

使用 ASP.NET 在事件日志中创建一个新的事件源时,您可能会收到下面的错误信息:

System.Security.SecurityException:Requested registry access is not allowed.

原因

默认情况下, ASP.NET 工作进程的用户令牌是 ASPNET (或者,对于 Internet 信息服务 [IIS] 6.0 上运行的应用程序是 NetworkService )。由于您的帐户不具有创建事件源的正确用户权限,会出现 症状 部分中的问题。

 

那么什么情况下,会导致我们的 Enterprise Library 会不顾及 ASP.NET 调用者的感受,而强行创建新的事件源呢?

实际上也是因为一些无足轻重的原因。

Enterprise Library 会主动创建一些新的性能计数器。调用链是这样的:

1 :调用 Common. InstrumentedEvent Initialize 方法:

AddPerformanceCounter(counterCategory, counterNames, createNewInstance);

2 :而这个 AddPerformanceCounter 函数中用到了

PerformanceCounterInstances instances = new PerformanceCounterInstances(category, counterNames[i], createNewInstance);

3 PerformanceCounterInstances 呢,又是利用

new PerformanceCounter( this .categoryName, this .counterName, CurrentInstanceName, false )

来创建计数器。 PerformanceCounter 初始化 System.Diagnostics.PerformanceCounter 类的新的只读实例或读 / 写实例,并将其与本地计算机上指定的系统性能计数器或自定义性能计数器及类别实例关联。

但是创建性能计数器的时候,出了点错误,错误信息如下所示:

错误信息

Failed to create instances of performance counter 'Total Cache Entries' - 请求的性能计数器不是自定义计数器,它必须初始化为只读。

 

所以 Enterprise library 认为它需要通知你,通过以下代码:

EventLog eventlog = new EventLog(SR.LogName, SR.MachineName, SR.FailureLogSource);

eventlog.WriteEntry(message_, EventLogger.FailureLogType);

写一个 Windows 应用程序 事件日志。

EventLog 构造函数 的第三个参数 SR.FailureLogSource ,其对应的字符串就是“ Enterprise Library Instrumentation ”。

 

这时候,它本希望能够增加“ Enterprise Library Instrumentation ”为一个新的事件源,就是在注册表

HKEY_LOCAL_MACHINE\

SYSTEM\

CurrentControlSet\

Services\

Eventlog\Application

下新建一个项叫做“ Enterprise Library Instrumentation ”的。但是, ASP.NET 的用户身份限制了创建工作。于是,异常被引发了。并且,一路被抛了出来,导致所有的工作都无法进行下去。

这是一个不应该被如此重视的异常错误,完全可以忽略。

上面的阐述,是我个人的理解,可能与事实之间存在偏差。

[ 解决 ]

临时救急的办法:

我们有一个神奇的解决办法,是 houxy 找到的“ IIS 虚拟目录的匿名访问选择框点掉再选中”大法:

首先,不让该站点虚拟目录启用匿名访问,这样在本机管理员身份下访问你的 web 应用,因为你当前的身份应该拥有对注册表的权限,所以肯定能做 Enterprise Library 要做的事情。然后,再让虚拟目录启用匿名访问,再次访问 Web 应用,一切恢复正常,不再报告“ System.Security.SecurityException: 不允许所请求的注册表访问权。”了。

这时候,你从 Windows 应用程序日志中可以看到这么两个错误日志:

Windows 应用程序日志 1

事件类型 :       错误

事件来源 :       Enterprise Library Instrumentation

事件种类 :      

事件 ID: 0

日期 :              2006-4-30

事件 :              15:06:00

描述 :

Failed to create instances of performance counter ' Total Cache Entries ' - 请求的性能计数器不是自定义计数器,它必须初始化为只读。 .

 

 

事件类型 :       错误

事件来源 :       Enterprise Library Instrumentation

事件种类 :      

事件 ID: 0

日期 :              2006-4-30

事件 :              15:06:00

描述 :

Failed to create instances of performance counter ' Cache Total Turnover Rate ' - 请求的性能计数器不是自定义计数器,它必须初始化为只读。 .

 

 

重新编译的办法:

蝈蝈俊在他的《 使用企业库在某些站点会报试图执行安全策略不允许的操作异常的解决方法。 》中已经谈及了。不再阐述了。不过我没有在客户现场试验成功。

 

 

主动 Installutil 的办法:

"在服务器端执行一下: InstallUtil Microsoft.Practices.EnterpriseLibrary.Caching.dll 就好了,其他模块也是这么做。 "----- liweiguang said.

 

在部署之前主动 InstallService 的办法:

在新 Windows2003 环境下,首先安装 Enterprise Library

之后运行 Microsoft Enterprise Library 安装目录下的 src 子文件夹下的

InstallServices.bat 。即可彻底解决这个问题。

( 注:不安装 Enterprise Library 也可以。在海油新大楼环境中,我就没有安装 Enterprise Library 。只不过由于没有进行 InstallServices.bat 的预处理,所以遇到了前面说的这个问题,实际上如果运行了这个 bat 文件中的

if Exist Microsoft.Practices.EnterpriseLibrary.Caching.dll installutil %action% Microsoft.Practices.EnterpriseLibrary.Caching.dll

语句命令,这样,我们通过

installutil Microsoft.Practices.EnterpriseLibrary.Caching.dll

就可以预先将 Caching 库所需要的性能计数器等资源准备好。 )

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=706243


[EntLibFAQ]“不允许所请求的注册表访问权”的解释[0508Update]


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论