首页 > 解决方案 > OnEntryWritten 读取的消息带有未设置的参数

问题描述

我正在使用 OnEntryWritten 事件,以便在事件被触发时从事件日志中获取事件。

我今天开始看到的问题是某些消息带有未设置的参数。

例如:

Windows 筛选平台已允许绑定到本地端口。应用程序信息:进程 ID:9852 应用程序名称:\device\harddiskvolume7\program files (x86)\google\chrome\application\chrome.exe 网络信息:源地址:::源端口:51714 协议:17 过滤器信息:过滤器运行-时间 ID:0 层名称:%%14608 层运行时间 ID:38

可以看到 %%14608 参数。如果我在事件查看器中看到相同的日志,这会附带一个值。

我将 Windows 服务作为 LocalSystem 运行,所以我不知道这是权限问题还是这项技术根本没用。我已经尝试了 C# 上提供的其余部分,但它们也不符合我的要求。

更新:这是我用来读取事件的代码。

1)首先我订阅了相应的事件日志:

private void Subscribe()
        {
            _eventLog.EnableRaisingEvents = true;
            var callbackFunction = new EntryWrittenEventHandler(OnEntryWritten);
            _eventLog.EntryWritten += callbackFunction;

            // Save a reference for callbackFunction
            _eventHandler = callbackFunction;
        }

2)然后在回调方法上,我从消息中读取数据:

public void OnEntryWritten(Object source, EntryWrittenEventArgs entryArgs)
        {
            // When overwrite policy is enabled, this will trigger for all elements when it starts writing new ones
            try
            {
                var entry = entryArgs.Entry;
                var timeWritten = entry.TimeWritten;

                // This comes with %% values depending on the log
                string message = entry.Message;

            }
            catch(Exception ex)
            {
                ...
            }
        }

3) 事件日志变量简单地初始化为:

var eventLog = EventLog.GetEventLogs().FirstOrDefault(el => el.Log.Equals(logName, StringComparison.OrdinalIgnoreCase));

我需要一些帮助,老实说,我不知道还有什么可以尝试的。

更新 我在这里添加了一些图像,以便每个人都可以更好地了解情况。老实说,除了实现字典并手动替换所需的值之外,似乎没有其他解决方案,这些值似乎始终是常量。

这是我在给定事件 ID 的事件查看器上看到的内容: 来自事件查看器的数据

这是我在阅读该条目时在程序中看到的内容: 正在从程序 1 中读取条目

正在从程序 2 中读取条目

您可以清楚地看到以下值:

在 ReplacementStrings 和 Message 属性中未映射为:%%2499 和 %%2458

这是我在程序上得到的消息值:
“密钥文件操作。\r\n\r\n主题:\r\n\t安全 ID:\t\tS-1-5-18\r\n\t帐户名称:\t\tMyAccount$\r\n\tAccount 域:\t\tWORKGROUP\r\n\t登录 ID:\t\t0x3e7\r\n\r\n进程信息:\r\n\t进程 ID:\t \t6644\r\n\t进程创建时间:\t2019-04-03T12:17:24.587994400Z\r\n\r\n加密参数:\r\n\t提供者名称:\tMicrosoft 软件密钥存储提供者\r\n \t算法名称:\tUNKNOWN\r\n\t密钥名称:\t816339d2-c476-4f1e-bc40-954f0aa0f851\r\n\t密钥类型:\t%%2499\r\n\r\n密钥文件操作信息:\ r\n\t文件路径:\tC:\ProgramData\Microsoft\Crypto\Keys\6d55a45fd69327293e9ed3e7930f4565_5663a8bb-2d1d-4c0d-90c1-624beddabe9c\r\n\t操作:\t%%2458\r\n\t返回码:\t0x0 "

在这里可以做什么?entry.Data 中也没有任何内容可以帮助我获得这两个值。

标签: c#windowsevent-log

解决方案


不,我相信你弄错了,很抱歉这个答案为时已晚。我发现了一个由 chrome 引发的类似事件,并评估了事件处理程序是否遗漏了任何内容。没有任何遗漏。我在控制台输出中得到的消息与我在事件查看器中看到的完全一致。

更好的解决方案是

使用entry.Data代替entry.Message获取完整数据

entry.Data将返回一个byte[]您可以转换为字符串的。这是条目将具有的所有属性的链接。


推荐阅读