You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过WMI订阅Microsoft-Windows-NetworkProfile/Operational日志事件?

解决WMI订阅现代事件日志通道的问题

你的问题出在Win32_NTLogEvent默认仅监听传统Windows日志(如Application、Security),像Microsoft-Windows-NetworkProfile/Operational这类现代事件日志通道,必须在WMI查询中明确指定日志路径才能被捕获。

方法一:修改WMI查询语句

直接在原查询中添加日志路径过滤条件,就能让WMI定位到目标日志:

string query = @"
SELECT * FROM __InstanceCreationEvent WITHIN 1 
WHERE TargetInstance ISA 'Win32_NTLogEvent' 
AND TargetInstance.EventCode = '10000'
AND TargetInstance.LogFile = 'Microsoft-Windows-NetworkProfile/Operational'";

ManagementEventWatcher generalWatcher = new ManagementEventWatcher(query);
generalWatcher.EventArrived += new EventArrivedEventHandler(OnWmiEventArrived);
generalWatcher.Start();

注意事项

  • 必须以管理员权限运行程序,部分Operational日志需要高权限才能订阅事件。
  • 确认日志名称准确性:在事件查看器中找到目标日志,右键→属性,查看「全名」字段,确保和查询中的LogFile值完全一致。

方法二:使用更适配的Windows Event Log API

如果WMI方式仍有兼容性问题,推荐使用专门针对现代事件日志的EventLogWatcher类(属于System.Diagnostics.Eventing.Reader命名空间),这是微软官方推荐的现代日志监听方案:

using System.Diagnostics.Eventing.Reader;

// 创建针对目标日志和事件ID的查询
EventLogQuery eventQuery = new EventLogQuery(
    "Microsoft-Windows-NetworkProfile/Operational",
    PathType.LogName,
    "*[System/EventID=10000]");

// 初始化日志监视器
EventLogWatcher logWatcher = new EventLogWatcher(eventQuery);

// 绑定事件处理逻辑
logWatcher.EventRecordWritten += (sender, args) =>
{
    if (args.EventRecord != null)
    {
        // 在这里处理触发的事件,比如输出事件信息
        Console.WriteLine($"捕获到事件ID: {args.EventRecord.Id}");
        // 可通过args.EventRecord获取更多事件详情
    }
};

// 启动监听
logWatcher.Enabled = true;

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

火山引擎 最新活动