You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET Core 6.0如何读取Microsoft-Windows-Ntfs/Operational事件日志

问题原因

你当前使用的EventLog类封装的是传统Windows事件日志接口,仅支持Application、Security、System这类经典系统日志分类,无法访问Windows Vista之后新增的「应用程序和服务日志」体系下的ETW通道日志,Microsoft-Windows-Ntfs/Operational就属于这类新日志通道,因此直接用旧类访问会提示日志不存在。PowerShell的Get-WinEvent底层调用的是新一代Windows事件日志接口,因此可以正常读取。

.NET 6 实现方案

使用System.Diagnostics.Eventing.Reader命名空间下的专用类访问新体系日志,这套API和Get-WinEvent底层逻辑一致,可正常读取所有Windows事件日志通道的内容。

  • 首先确认项目目标框架为Windows专属版本(例如net6.0-windows),相关日志API仅支持Windows平台。
  • 引入所需命名空间:
using System.Diagnostics.Eventing.Reader;
  • 日志读取实现代码:
// 指定日志通道名称,和PowerShell中传入的日志名完全一致
const string targetLogName = "Microsoft-Windows-Ntfs/Operational";
// 构建日志查询:参数1为日志路径,参数2指定路径类型为日志名,参数3为筛选XPath,传null即查询所有条目
var logQuery = new EventLogQuery(targetLogName, PathType.LogName, null);

using var reader = new EventLogReader(logQuery);
EventRecord currentEntry;
// 逐条遍历日志条目,读取到末尾时返回null
while ((currentEntry = reader.ReadEvent()) != null)
{
    // 按需读取日志属性:事件ID、创建时间、级别、消息内容等
    Console.WriteLine($"事件ID: {currentEntry.Id} | 生成时间: {currentEntry.TimeCreated:yyyy-MM-dd HH:mm:ss}");
    Console.WriteLine($"日志内容: {currentEntry.FormatDescription()}\n");
    
    currentEntry.Dispose();
}
注意事项
  • 若运行时提示日志不存在,先打开本地事件查看器,定位到「应用程序和服务日志/Microsoft/Windows/Ntfs/Operational」路径,右键打开属性确认日志处于启用状态,未启用的日志通道不会被系统注册,无法查询。
  • 若需要筛选特定条件的日志(比如指定事件ID、指定时间范围的条目),直接给EventLogQuery传入XPath筛选语句即可,查询效率远高于读取全量条目后在内存中过滤,语法和Get-WinEvent的XPath筛选规则完全一致。
  • 访问受权限保护的日志(比如安全日志、部分系统核心日志)时,需要以管理员身份运行程序,否则会抛出权限不足异常。

内容的提问来源于stack exchange,提问作者peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:24:15