使用.NET远程读取事件日志

时间:2011-03-15 14:28:01

标签: c# .net permissions event-log

我想阅读远程计算机上的事件日志,以检查测试期间的错误。这是一些相关的代码:

public bool CheckEventLogs(DateTime start)
{
  EventLog myEventLog = new EventLog("CustomLog", "ServerName");
  bool errorFound = false;
  foreach (EventLogEntry entry in myEventLog.Entries)
  {
    if (entry.EntryType == EventLogEntryType.Error && entry.TimeGenerated >= start)
    {
       Console.WriteLine("Error in Event Log:\n" + entry.Message + "\n");
       errorFound = true;
    }
  }
  return errorFound;
}

目前,此代码抛出异常(尝试执行未经授权的操作)。根据{{​​3}},我需要EventLogPermission,但我一直在努力寻找如何使用此权限的任何示例。有没有人有一个如何做到这一点的例子?

编辑:对评论的回复

感谢大家的评论 - 这是所要求的其他信息:

foreach语句抛出异常。具体来说,当突出显示in之后,在步骤中抛出的代码。似乎我能够创建事件日志对象,但我无法访问事件日志中的条目。

我的帐户无权读取目标系统上的事件日志,但我拥有帐户的凭据。通过事件查看器手动连接时,可以选择以另一个用户身份进行连接。手动完成后,我的代码运行没有问题。但是,每次运行此程序时,我都不能依赖它。我需要的是一种以编程方式作为另一个用户连接的方法。我认为EventLogPermission将是这样做的方式,但也许还有另一种方式。如果有人知道如何以C#中的不同用户身份连接到远程日志,那正是我所寻找的。

2 个答案:

答案 0 :(得分:7)

WMI对此非常有用,像

这样的代码片段
SELECT Logfile,TimeGenerated,Type,SourceName,Message FROM Win32_NTLogEvent

允许您查询日志。来自MS的This utility将允许您探索WMI,甚至可以构建.net代码来调用查询。

另一个好处是它可以获得所有活动,并将它们带到应用程序本地,您可以在闲暇时解析它们。如果在处理过程中断开连接,则以现在的方式迭代事件很容易失败(顺便说一下,这与数据库访问通常采用的方法相同)。

答案 1 :(得分:4)

感谢所有对此问题发表评论的人。一旦我意识到权限可能不是.NET的一部分,而是Windows和事件查看器本身的一部分,我为自己的调查提供了一些新方向。

看起来像是一个“net use”命令,只需要在我的本地计算机和远程计算机之间建立连接。在使用我在问题中发布的代码之前调用“net use”时,事情很有效。在从事件日志中读取之前,从代码中调用它是很简单的。

再次感谢您的帮助!