在ASP.NET程序中使用事件日志的条件——关于注册表的访问控制表
2010-08-01 11:52 Nana's Lich 阅读(1319) 评论(0) 编辑 收藏 举报近几天折腾了一个比较奇怪的东西,放在服务器上就出现莫名其妙的故障。
由于没法直接在服务器上调试,手边又没有服务器的镜像,就想到靠事件日志来记录运行过程中产生的异常来分析。
但是在最初的尝试中,总是会产生安全异常——根据提示检查.NET权限设置也没发现问题出在哪里……
在参考了一些文章、又经过一些探索之后,可以我发现:
1、对事件日志进行任何操作时必须具有读取事件日志服务的注册表项目的权限。
2、无论对日志进行何种操作,必须要具有对安全日志的注册表项目进行读取的权限。
3、创建新的日志和事件/消息源时必须具有对事件日志服务的注册表项目进行值写入的权限,同时还需要在其下创建子项目的权限。
需要注意的是:
一般情况下运行ASP.NET程序的程序池所使用的身份是Network Service或者ASPNET,而这两个身份是没有操作事件日志服务的注册表项目的权限的,所以在ASP.NET程序中使用事件日志之前必须设置相应的注册表项目,允许ASP.NET的程序池对其访问——事件日志服务在注册表中对应的路径是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog。
另外安全日志对应事件日志之的Security注册表项目,它的ACL并不直接继承自eventlog,是需要单独设置的。
在为eventlog添加了允许Network Service读写和创建子项目、为Security添加了允许Network Service进行读取的访问控制规则以后,我的ASP.NET应用程序就可以创建并写入事件日志了。
对于类似的问题,微软知识库中有一个建议的解决方法,是运行一个使用EventLogInstaller组件创建的独立的应用程序——不过本质上还是利用了管理员的特权来进行操作,在此就不再详细说明了。