如何检查此事件日志是否存在?

问题描述 投票:2回答:3

在我的一个项目中,我需要检查机器上是否存在事件日志“Microsoft-Exchange-ManagedAvailability / Monitoring”(事件源是ManagedAvailability)。

我用了

EventLog.Exists("Microsoft-Exchange-ManagedAvailability/Monitoring")

EventLog.SourceExists("ManagedAvailability")

两者都返回false,但事件日志确实存在。它位于“应用程序和服务日志”/ Microsoft /下,请参见屏幕截图。

那么,我该如何检查这个日志是否存在?

谢谢

enter image description here

c# .net event-log eventlog-source
3个回答
2
投票

似乎EventLog.Exists()不支持新的Vista-hyphenated-format-with-slash格式。 Process Monitor表明它试图打开HKLM\System\CurrentControlSet\Services\EventLog\Microsoft-Exchange-ManagedAvailability/Monitoring,它不存在 - 它在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\Microsoft-Windows-SENSE/Operational

所以我想你要么必须尝试打开并捕获失败异常(丑陋),要么获取所有事件日志的列表并找到你的:

EventLogSession.GlobalSession.GetLogNames().Any(
    s => string.Equals(s, "Microsoft-Exchange-ManagedAvailability/Monitoring", StringComparison.OrdinalIgnoreCase))

1
投票

您是否在具有用户帐户控制(UAC)的计算机上运行此操作?我刚刚查看了EventLog上的MSDN页面,发现了这个花絮:

因为此方法访问注册表,您必须在本地计算机上具有相应的注册表权限;否则,查询返回false。

我不知道事件日志是如何与注册表完全相关的,但我已经完成了与注册表的其他工作。如果是同样的问题,则需要提高执行权限级别。要做到这一点,你需要add an application manifest file到解决方案,并设置requestedExecutionLevel level="requireAdministrator",这意味着无论何时在使用UAC的计算机上运行应用程序,它都会询问“你确定吗?”。您还需要确保项目属性指定要使用的清单。

我遇到的另一个陷阱是,当您通过Visual Studio进行调试时,它将以VS执行级别运行,而不是在清单(see here)中指定的级别。最简单的解决方案是将VS设置为在快捷方式属性中以管理员身份运行。


1
投票

您是否拥有访问事件源的适当权限?对于例如您可能需要管理员权限才能检查事件源。

来自MSDN

因为此方法访问注册表,您必须在本地计算机上具有相应的注册表权限;否则,查询返回false。

EDIT1

您是否可以尝试使用以下代码来检查计算机上列出的事件logName。获取列表后,检查事件logName是否存在,如果存在,则在代码中为事件logName传递相同的名称。

此外,您可以导航到需要信息的事件日志(右键单击) - >属性 - >全名。此名称应在Exists方法中使用。

System.Diagnostics.Eventing.Reader.EventLogSession.GlobalSession.GetLogNames()
© www.soinside.com 2019 - 2024. All rights reserved.