【问题标题】:How to check whether this event log exist?如何检查此事件日志是否存在?
【发布时间】:2016-01-04 22:28:44
【问题描述】:

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

我用过

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

EventLog.SourceExists("ManagedAvailability")

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

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

谢谢

【问题讨论】:

  • 我最大的问题是事件日志名称的语法。我在 MSDN 中看不到任何明显的东西来演示嵌套日志是如何命名的。我将从迭代现有日志 (see here) 开始,看看您是否能准确找到该日志的命名方式。例如,是否需要指定根日志文件夹为“Applications and Services Logs”?
  • 诀窍在于它不是事件日志。任何嵌套的都是通过 ETW。有关如何阅读 ETW 提供程序的更多信息,请参阅 stackoverflow.com/a/21012623/138200

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


【解决方案1】:

EventLog.Exists() 似乎只支持经典事件日志,不支持 new-since-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))

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      来自MSDN

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

      EDIT1

      您能否尝试使用以下代码来检查您机器上列出的事件日志名称是什么。获取列表后,检查 Event logName 是否存在,如果存在,在代码中为 event logName 传递相同的名称。

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

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

      【讨论】:

      • EventLog 类可以读取的日志名称可以在静态EventLog.GetEventLogs() 中找到,在我的系统上,它列出的日志比您的Eventing.Reader.EventLogSession.GlobalSession.GetLogNames() 少得多,并有助于解释为什么 OP 无法打开它们使用EventLog 类记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多