尝试在.NET中使用EventLog.SourceExists方法时出现问题

use*_*010 24 .net c#

我正在尝试使用C#在我的应用程序中使用事件日志,所以我添加了以下代码

if (!EventLog.SourceExists("SomeName"))
EventLog.CreateEventSource("SomeName", "Application");
Run Code Online (Sandbox Code Playgroud)

EventLog.SourceExists导致SecurityException显示
"找不到源,但无法搜索部分或全部事件日志.无法访问的日志:安全性."

我在Windows 7中以管理员身份运行.

任何帮助都会得到满足.

Jus*_*tin 15

这是权限问题 - 您应该授予正在运行的用户读取以下注册表项的权限:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog
Run Code Online (Sandbox Code Playgroud)

或者,您可以绕过CreateEventSource删除访问此注册表项的必要性.

以下主题中将详细介绍这两种解决方案 - 如何在Vista下创建事件日志源?.


Gra*_*ger 7

是的,这是一个权限问题,但实际上比当前接受的答案所表明的要糟糕。实际上有2个部分。

第1部分

为了使用SourceExists(),您的代码在其下运行的帐户必须对该HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog密钥具有“读取”权限,并且还必须对每个后代密钥具有“读取”权限。问题是该密钥的某些子项不继承权限,并且只允许一部分帐户读取它们。例如一些我知道的:

  • 安全
  • 状态
  • 虚拟服务器

因此,您还必须在它们存在时手动更改它们

仅供参考,对于那些连管理员帐户都没有“完全访问”权限的密钥(例如“状态”),您必须使用PsExec/PsExec64来“修复”问题。如此StackOverflow 答案中所示,下载PsTools。从提升的命令提示符运行它:PsExec64 -i -s regedit.exe您将能够向该密钥添加您需要的权限。

第2部分

为了成功使用CreateEventSource(),您的代码在其下运行的帐户必须具有“完全控制”权限,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog并且您添加新源的日志具有“完全控制”权限。

但是等等,还有更多……

同样重要的是要知道,无论CreateEventSource()WriteEntry()呼叫SourceExists()“引擎盖下”。所以最终,如果你想在 .Net 中使用 EventLog 类,你必须在注册表中更改权限。该帐户需要对HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog密钥进行“完全控制”并为所有孩子“阅读”。

评论:而且我相信所有这些混乱都是因为当 Microsoft 最初设计 EventLog 时,他们认为人们能够通过“源”记录某些内容而无需知道“源”随附的日志是至关重要的。