在我的一个项目中,我需要检查计算机上是否存在事件日志“Microsoft-Exchange-ManagedAvailability / Monitoring”(事件源是ManagedAvailability)。
我用过
EventLog.Exists("Microsoft-Exchange-ManagedAvailability/Monitoring")
和
EventLog.SourceExists("ManagedAvailability")
两者都返回false,但事件日志确实存在。它位于“应用程序和服务日志”/ Microsoft /下,请参见屏幕截图。
那么,如何检查此日志是否存在?
由于
答案 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设置为在快捷方式属性中以管理员身份运行。