[EntLibFAQ] “不允許所請求的注冊表訪問權(quán)”的解釋
Version
|
Date
|
Creator
|
Description
|
1.0.0.1
|
2006-5-2
|
鄭昀
@Ultrapower
|
草稿
|
繼續(xù)閱讀之前,我們假設(shè)您熟悉以下知識:
n
????????
Microsoft Enterprise Library June 2005
n
????????
EventLog
和注冊表的關(guān)系
? [ 現(xiàn)象 ]
首先,這種情況發(fā)生在第一次使用
Microsoft Enterprise Library June 2005
的庫
(
不限定是哪一個庫,可以是
Caching
,或者
Security)
時,并且你的應(yīng)用是
Web
應(yīng)用:
在
Windows2000
上,你也許會看到錯誤“
拒絕對注冊表項(xiàng)的訪問
”;
在
Windows2003
上,你將看到
“
System.Security.SecurityException:
不允許所請求的注冊表訪問權(quán)。
”
此種情形,蟈蟈俊在他的《
使用企業(yè)庫在某些站點(diǎn)會報試圖執(zhí)行安全策略不允許的操作異常的解決方法。
》中已經(jīng)談及了。我下面將試圖詳細(xì)說明原因。
[
分析
]
比如我的
ASP.NET
構(gòu)建的
Web
站點(diǎn)中由于用到了
EnterpriseLibrary
的
Caching
庫,所以在客戶生產(chǎn)環(huán)境中部署的時候,當(dāng)部署完畢,第一次瀏覽站點(diǎn)時,我們遭遇了這個錯誤。
也許你熟悉
ASP.NET
的這種報錯,知道應(yīng)該用微軟
KB329291
來解釋
(
http://support.microsoft.com/?scid=kb;zh-cn;329291&spid=810&sid=58
)
:
KB
信息
|
癥狀
使用
ASP.NET
在事件日志中創(chuàng)建一個新的事件源時,您可能會收到下面的錯誤信息:
System.Security.SecurityException:Requested registry access is not allowed.
|
原因
默認(rèn)情況下,
ASP.NET
工作進(jìn)程的用戶令牌是
ASPNET
(或者,對于
Internet
信息服務(wù)
[IIS] 6.0
上運(yùn)行的應(yīng)用程序是
NetworkService
)。由于您的帳戶不具有創(chuàng)建事件源的正確用戶權(quán)限,會出現(xiàn)
“
癥狀
”
部分中的問題。
|
那么什么情況下,會導(dǎo)致我們的
Enterprise Library
會不顧及
ASP.NET
調(diào)用者的感受,而強(qiáng)行創(chuàng)建新的事件源呢?
實(shí)際上也是因?yàn)橐恍o足輕重的原因。
Enterprise Library
會主動創(chuàng)建一些新的性能計數(shù)器。調(diào)用鏈?zhǔn)沁@樣的:
1
:調(diào)用
Common. InstrumentedEvent
的
Initialize
方法:
AddPerformanceCounter(counterCategory, counterNames, createNewInstance);
2
:而這個
AddPerformanceCounter
函數(shù)中用到了
PerformanceCounterInstances instances =
new
PerformanceCounterInstances(category, counterNames[i], createNewInstance);
3
:
PerformanceCounterInstances
呢,又是利用
new
PerformanceCounter(
this
.categoryName,
this
.counterName, CurrentInstanceName,
false
)
來創(chuàng)建計數(shù)器。
PerformanceCounter
是
初始化
System.Diagnostics.PerformanceCounter
類的新的只讀實(shí)例或讀
/
寫實(shí)例,并將其與本地計算機(jī)上指定的系統(tǒng)性能計數(shù)器或自定義性能計數(shù)器及類別實(shí)例關(guān)聯(lián)。
但是創(chuàng)建性能計數(shù)器的時候,出了點(diǎn)錯誤,錯誤信息如下所示:
錯誤信息
|
Failed to create instances of performance counter 'Total Cache Entries' -
請求的性能計數(shù)器不是自定義計數(shù)器,它必須初始化為只讀。
|
所以
Enterprise library
認(rèn)為它需要通知你,通過以下代碼:
EventLog eventlog =
new
EventLog(SR.LogName, SR.MachineName, SR.FailureLogSource);
eventlog.WriteEntry(message_, EventLogger.FailureLogType);
寫一個
Windows
應(yīng)用程序
事件日志。
EventLog
構(gòu)造函數(shù)
的第三個參數(shù)
SR.FailureLogSource
,其對應(yīng)的字符串就是“
Enterprise Library Instrumentation
”。
這時候,它本希望能夠增加“
Enterprise Library Instrumentation
”為一個新的事件源,就是在注冊表
HKEY_LOCAL_MACHINE\
SYSTEM\
CurrentControlSet\
Services\
Eventlog\Application
下新建一個項(xiàng)叫做“
Enterprise Library Instrumentation
”的。但是,
ASP.NET
的用戶身份限制了創(chuàng)建工作。于是,異常被引發(fā)了。并且,一路被拋了出來,導(dǎo)致所有的工作都無法進(jìn)行下去。
這是一個不應(yīng)該被如此重視的異常錯誤,完全可以忽略。
上面的闡述,是我個人的理解,可能與事實(shí)之間存在偏差。
[
解決
]
臨時救急的辦法:
我們有一個神奇的解決辦法,是
houxy
找到的“
IIS
虛擬目錄的匿名訪問選擇框點(diǎn)掉再選中”大法:
首先,不讓該站點(diǎn)虛擬目錄啟用匿名訪問,這樣在本機(jī)管理員身份下訪問你的
web
應(yīng)用,因?yàn)槟惝?dāng)前的身份應(yīng)該擁有對注冊表的權(quán)限,所以肯定能做
Enterprise Library
要做的事情。然后,再讓虛擬目錄啟用匿名訪問,再次訪問
Web
應(yīng)用,一切恢復(fù)正常,不再報告“
System.Security.SecurityException:
不允許所請求的注冊表訪問權(quán)。”了。
這時候,你從
Windows
應(yīng)用程序日志中可以看到這么兩個錯誤日志:
Windows
應(yīng)用程序日志
1
|
事件類型
:
?????
錯誤
事件來源
:
?????
Enterprise Library Instrumentation
事件種類
:
?????
無
事件
ID:
0
日期
:
????????????
2006-4-30
事件
:
????????????
15:06:00
描述
:
Failed to create instances of performance counter '
Total Cache Entries
' -
請求的性能計數(shù)器不是自定義計數(shù)器,它必須初始化為只讀。
.
|
事件類型
:
?????
錯誤
事件來源
:
?????
Enterprise Library Instrumentation
事件種類
:
?????
無
事件
ID:
0
日期
:
????????????
2006-4-30
事件
:
????????????
15:06:00
描述
:
Failed to create instances of performance counter '
Cache Total Turnover Rate
' -
請求的性能計數(shù)器不是自定義計數(shù)器,它必須初始化為只讀。
.
|
重新編譯的辦法:
蟈蟈俊在他的《
使用企業(yè)庫在某些站點(diǎn)會報試圖執(zhí)行安全策略不允許的操作異常的解決方法。
》中已經(jīng)談及了。不再闡述了。不過我沒有在客戶現(xiàn)場試驗(yàn)成功。
主動
Installutil
的辦法:
"在服務(wù)器端執(zhí)行一下:
InstallUtil Microsoft.Practices.EnterpriseLibrary.Caching.dll
就好了,其他模塊也是這么做。 "-----
liweiguang said.
?
在部署之前主動
InstallService
的辦法:
在新
Windows2003
環(huán)境下,首先安裝
Enterprise Library
。
之后運(yùn)行
Microsoft Enterprise Library
安裝目錄下的
src
子文件夾下的
InstallServices.bat
。即可徹底解決這個問題。
(
注:不安裝
Enterprise Library
也可以。在海油新大樓環(huán)境中,我就沒有安裝
Enterprise Library
。只不過由于沒有進(jìn)行
InstallServices.bat
的預(yù)處理,所以遇到了前面說的這個問題,實(shí)際上如果運(yùn)行了這個
bat
文件中的
if Exist Microsoft.Practices.EnterpriseLibrary.Caching.dll installutil %action% Microsoft.Practices.EnterpriseLibrary.Caching.dll
語句命令,這樣,我們通過
installutil Microsoft.Practices.EnterpriseLibrary.Caching.dll
就可以預(yù)先將 Caching 庫所需要的性能計數(shù)器等資源準(zhǔn)備好。 )
?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=706243
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
