[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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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