[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