Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查此事件日志是否存在?_C#_.net_Event Log_Eventlog Source - Fatal编程技术网

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

C# 如何检查此事件日志是否存在?,c#,.net,event-log,eventlog-source,C#,.net,Event Log,Eventlog Source,在我的一个项目中,我需要检查机器上是否存在事件日志“Microsoft Exchange ManagedAvailability/Monitoring”(事件源是ManagedAvailability) 我曾经 EventLog.Exists("Microsoft-Exchange-ManagedAvailability/Monitoring") 及 两者都返回false,但事件日志确实存在。它位于“应用程序和服务日志”/Microsoft/下,请参见屏幕截图 那么,如何检查此日志是否存在 谢

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

我曾经

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

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

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

谢谢


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

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

EDIT1

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

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

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

您是否在具有用户帐户控制(UAC)的计算机上运行此操作?我刚刚查看了上的MSDN页面,发现了以下小贴士:

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

我不知道事件日志与注册表到底有什么关系,但我对注册表做了其他工作。如果是相同的问题,则需要提高执行权限级别。要做到这一点,您需要访问解决方案,并设置
requestedExecutionLevel=“requireAdministrator”
,这意味着每当您在带有UAC的机器上运行应用程序时,它都会询问“您确定吗?”。您还需要确保项目属性指定要使用的清单


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

似乎
EventLog.Exists()
只支持经典事件日志,不支持新的带斜杠格式的自Vista连字符格式。显示它试图打开
HKLM\System\CurrentControlSet\Services\EventLog\Microsoft Exchange ManagedAvailability/Monitoring
,但该文件不存在-它位于
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channel\Microsoft Windows SENSE/Operational

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

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

我最大的问题是事件日志名称的语法。我在MSDN中看不到任何明显的东西来演示嵌套日志是如何命名的。首先,我将迭代现有的日志(),看看您是否能够准确地找到该日志的命名方式。例如,是否需要指定根日志文件夹为“应用程序和服务日志”?诀窍在于它不是事件日志。任何嵌套的内容都是通过ETW进行的。有关如何读取ETW提供程序的更多信息,请参阅。
EventLog
类可以读取的日志名可以在静态中找到,在我的系统上,它列出的日志远远少于
Eventing.Reader.EventLogSession.GlobalSession.GetLogNames()
并帮助解释OP无法使用
EventLog
类打开日志的原因。
EventLogSession.GlobalSession.GetLogNames().Any(
    s => string.Equals(s, "Microsoft-Exchange-ManagedAvailability/Monitoring", StringComparison.OrdinalIgnoreCase))