3

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

我用了

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

EventLog.SourceExists("ManagedAvailability")

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

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

谢谢

在此处输入图像描述

4

3 回答 3

3

似乎EventLog.Exists()只支持经典事件日志,不支持 new-since-Vista hyphenated-format-with-slash 格式。进程监视器显示它试图打开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))
于 2018-03-21T09:17:02.353 回答
1

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

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

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

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

于 2016-01-04T22:36:43.137 回答
1

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

来自MSDN

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

编辑1

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

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

System.Diagnostics.Eventing.Reader.EventLogSession.GlobalSession.GetLogNames()
于 2016-01-04T22:36:01.420 回答