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

Bri*_*ian 10 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:对评论的回应

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

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

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

Sti*_*ack 7

WMI对此非常有用,类似于一个片段

SELECT Logfile,TimeGenerated,Type,SourceName,Message FROM Win32_NTLogEvent
Run Code Online (Sandbox Code Playgroud)

允许您查询日志.MS的这个实用程序将允许您浏览WMI,甚至可以构建.net代码来调用查询.

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


Bri*_*ian 4

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

看起来“net use”命令就足以在我的本地计算机和远程计算机之间建立连接。在使用我在问题中发布的代码之前调用“net use”时,事情进展顺利。在读取事件日志之前从代码中调用它非常简单。

再次感谢你的帮助!