`
happmaoo
  • 浏览: 4472539 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

[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站点中由于用到了EnterpriseLibraryCaching库,所以在客户生产环境中部署的时候,当部署完毕,第一次浏览站点时,我们遭遇了这个错误。

也许你熟悉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. InstrumentedEventInitialize方法:

AddPerformanceCounter(counterCategory, counterNames, createNewInstance);

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

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

3PerformanceCounterInstances呢,又是利用

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库所需要的性能计数器等资源准备好。)




分享到:
评论

相关推荐

    C# 动态设置是否允许运行注册表,实际上应该是是否允许修改注册表,注册表当然要运行了,要不然系统要崩溃的,一般来说,注册表的键值是不能随便改的,像有些优化软件都有禁止修改注册表的选项,以确保Windows设置不被破坏,那么本代码就实现了这个小功能,仅供参阅。

    首先,我们要明白,允许运行注册表并不意味着允许修改它,因为注册表始终是运行中的,它是操作系统正常运作的必需部分。我们要控制的是对注册表的修改权限。这通常涉及到Windows API调用,因为.NET Framework本身并...

    可获得完全控制权的注册表

    双击导入,后,右键点击“管理员取得所有权”

    修改注册表,让它允许运行ActiveX控件,

    修改注册表时必须谨慎,因为错误的操作可能会导致系统不稳定甚至崩溃。因此,在进行任何修改之前,建议先备份当前的注册表,以防万一。 接下来,我们将讨论如何通过修改注册表来启用ActiveX控件的运行: 1. **打开...

    JAVA访问WINDOWS注册表

    首先,Java本身并不直接提供访问操作系统注册表的功能。为了实现这一目标,我们需要借助第三方库。这里提到的“registry-3.1.3.zip”可能就是一个这样的库,它允许Java程序通过JNA(Java Native Access)或者JNI...

    google浏览器注册表配置

    标题中的“google浏览器注册表配置”指的是在Windows操作系统中,通过修改注册表来实现Google浏览器的顺利安装或优化其运行环境。注册表是Windows系统中存储配置信息的关键数据库,包括软件设置、硬件设备配置等。当...

    修改注册表来获取Win8.1 Update 1更新的方法.docx

    标题和描述中提到的方法是关于如何通过修改注册表来获取Windows 8.1 Update 1更新,这是一个非正式的途径,通常适用于那些急于尝试新更新但又未被微软官方推送的用户。下面是详细的操作步骤: 1. **打开注册表编辑...

    监控对目录、文件、注册表的访问 源代码

    标题中的“监控对目录、文件、注册表的访问 源代码”指的是一个软件开发项目,这个项目的主要目的是实现对操作系统中的目录、文件以及注册表的访问情况进行监控。这种功能通常用于系统安全、日志记录、故障排查或者...

    Edge Chromium 中如何始终允许运行 Flash 内容注册表项.reg

    Edge Chromium 中如何始终允许运行 Flash 内容注册表项.reg eage 浏览器默认开启Flash注册表项,双击导入注册表即可

    vc访问注册表类

    综上所述,`Registry.cpp` 和 `Registry.h` 文件中的`Registry`类为开发者提供了方便的方式来访问和管理Windows注册表,通过封装API调用,简化了代码,同时也提高了代码的可维护性和安全性。在实际项目中,这样的类...

    C# 动态设置是否允许运行注册表

    C# 动态设置是否允许运行注册表,实际上应该是是否允许修改注册表,注册表当然要运行了,要不然系统要崩溃的,一般来说,注册表的键值是不能随便改的,像有些优化软件都有禁止修改注册表的选项,以确保Windows设置不...

    注册表.bat,访问打开注册表

    打开注册表,修改清理设置系统注册表。

    sap gui 740快捷登录允许保存密码注册表

    sap gui 740快捷登录允许保存密码注册表,适用730、740

    易语言注册表操作类

    总之,易语言的注册表操作类为开发者提供了一种方便的途径来访问和管理注册表,但同时也需要谨慎对待,以确保程序的稳定性和系统的安全性。通过学习和熟练掌握这些功能,可以编写出更加高效且功能丰富的易语言程序。

    常见的注册表工具.rar

    2. **注册表编辑器**:Windows内置的RegEdit是标准的注册表编辑器,允许用户直接访问和修改注册表。但是操作不慎可能会导致系统不稳定,因此使用时需谨慎。 3. **注册表备份与恢复**:由于注册表的重要性,定期备份...

    U盘只读不存的注册表

    当设置为只读时,U盘将不允许写入新的数据,但仍然可以读取已存在的文件。 三、操作步骤 1. **打开注册表编辑器**:按下`Win+R`组合键打开“运行”对话框,输入`regedit`并回车,打开注册表编辑器。 2. **定位到...

    Java直接访问Windows注册表

    Jave的Preferences只在Software\JavaSoft\Prefs操作,反射WindowsPreferences能够操作Windows注册表的其他节点. 方法: 1.public static void put(int root,String path,String key,String val) 2.public static ...

    注册表提权工具.rar

    因为保密原因经常检查U盘连接,需要清理U盘记录,网上找的清理工具不能清理干净,清理完后USBstor下面还有金士顿等记录在,但无法更改权限,最后在微软官网淘到一个工具可以提权,然后手动清除记录就行,压缩包里有...

    禁用注册表,启用注册表

    这可以防止不必要的更改导致系统不稳定,尤其对于企业环境,管理员可能希望限制员工对注册表的访问,以保持系统的安全和一致性。禁用注册表的方法可以通过组策略或者第三方工具实现,这些方法通常会限制对注册表编辑...

    注册表对比软件,监视注册表

    注册表对比软件是一种工具,它可以帮助用户分析和比较系统注册表在不同时间点的状态,以追踪和识别由软件安装、系统设置更改或任何其他操作引起的修改。这些工具对于故障排除、系统维护和优化以及理解软件如何影响...

    力控注册表删除工具,力控卸载不净

    总之,力控注册表删除工具是为了解决力控软件卸载不彻底导致的问题,通过清理注册表中的相关条目,使得重新安装过程可以顺利进行。正确使用这样的工具,可以避免因注册表残留信息而引发的安装冲突,提高工作效率。...

Global site tag (gtag.js) - Google Analytics