我正在尝试使用C#在我的应用程序中使用事件日志,所以我添加了以下代码
if (!EventLog.SourceExists("SomeName"))
EventLog.CreateEventSource("SomeName", "Application");
EventLog.SourceExists导致说出
的SecurityException
“未找到源,但无法搜索部分或全部事件日志。无法访问日志:安全性。”
我在Windows 7中以管理员身份运行。
任何帮助都会得到满足。
答案 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)
是的,这是一个权限问题,但实际上比当前接受的答案要糟糕。实际上有两部分。
要使用SourceExists()
,运行代码的帐户必须具有对HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog
键的“读取”权限,并且还必须具有“读取”权限每个后代键的权限。问题是该密钥的子项中的 some 不继承权限,而仅允许一部分帐户读取它们。例如。一些我知道的东西:
因此,您还必须手动更改存在的那些。
仅供参考,对于即使管理员帐户也没有“完全访问”权限的那些键(例如“状态”),您将必须使用PsExec/PsExec64来“修复”问题。如本StackOverflow answer所示,下载PsTools。在提升的命令提示符下运行此命令:PsExec64 -i -s regedit.exe
,您将使他们能够为该密钥添加所需的权限。
为了成功使用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,因此在调试或执行该服务时,它将正确运行而不会生成异常。