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

时间:2011-07-18 16:07:20

标签: c# .net

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

if (!EventLog.SourceExists("SomeName"))
EventLog.CreateEventSource("SomeName", "Application");

EventLog.SourceExists导致说出
的SecurityException “未找到源,但无法搜索部分或全部事件日志。无法访问日志:安全性。”

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

任何帮助都会得到满足。

4 个答案:

答案 0 :(得分:15)

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog

或者,您可以绕过CreateEventSource,无需访问此注册表项。

在以下主题中更详细地解释了这两种解决方案 - How do I create an Event Log source under Vista?

答案 1 :(得分:3)

简短提示:

在服务安装期间注册了一个事件源(如果应用程序是Windows服务),并且可以在没有安全例外的情况下使用低级流程所有者(不是管理员)

我从SO / MSDN

以典型方式使用C#代码执行服务安装/运行

重要的是班级ServiceName中的属性System.ServiceProcess.ServiceBase

答案 2 :(得分:1)

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

第1部分

要使用SourceExists(),运行代码的帐户必须具有对HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog的“读取”权限,并且还必须具有“读取”权限每个后代键的权限。问题是该密钥的子项中的 some 不继承权限,而仅允许一部分帐户读取它们。例如。一些我知道的东西:

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

因此,您还必须手动更改存在的那些

仅供参考,对于即使管理员帐户也没有“完全访问”权限的那些键(例如“状态”),您将必须使用PsExec/PsExec64来“修复”问题。如本StackOverflow answer所示,下载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时,他们认为使人们能够通过“源”记录某些东西而不知道什么是至关重要的记录“来源”所在的位置。

答案 3 :(得分:0)

下午好, 最简单的是您以管理员身份运行vs2019,因此在调试或执行该服务时,它将正确运行而不会生成异常。