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

时间:2016-01-04 22:28:45

标签: c# .net event-log eventlog-source

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

我用过

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

EventLog.SourceExists("ManagedAvailability")

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

那么,如何检查此日志是否存在?

由于

enter image description here

3 个答案:

答案 0 :(得分:2)

似乎EventLog.Exists()不支持new-since-Vista带连字符格式的斜杠格式。 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 :(得分:1)

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

来自MSDN

  

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

<强> EDIT1

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

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

System.Diagnostics.Eventing.Reader.EventLogSession.GlobalSession.GetLogNames()

答案 2 :(得分:1)

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

  

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

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

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