讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何读取Windows事件日志并导出为XML【深度】

风明吖_4201

风明吖_4201

发布时间:2026-04-14 17:51:33

|

1043人浏览过

|

来源于php中文网

原创

EvtQuery 必须使用逻辑日志名(如"Application")或合法 XPath 查询,不可用物理路径;读取需正确权限与 LocalAlloc 分配缓冲区,并用 EvtRenderEventXml 渲染 UTF-16 XML。

c++如何读取windows事件日志并导出为xml【深度】

用 EvtQuery 获取事件日志句柄时,必须指定正确的日志路径和查询语法

Windows 事件日志不是普通文件,不能用 fopen 或 std::ifstream 直接读。必须通过 Windows API 的 EVT API(wevtapi.h)访问。最常踩的坑是日志路径写错:"Application"、"System" 是合法名称,但 "C:\Windows\System32\winevt\Logs\Application.evtx" 这种物理路径传给 EvtQuery 会失败——API 要求的是逻辑日志名或有效 XPath 查询字符串。

正确做法是使用系统预定义日志名,或构造 XPath 查询:

  • "Application"、"Security"、"System" 可直接作为 Path 参数传入 EvtQuery
  • 若需筛选,用 XPath 语法,例如:"*[System[(EventID=4624) and TimeCreated[timediff(@SystemTime) (过去24小时登录成功事件)
  • 注意:XPath 中的 必须写成 <code><(XML 实体),否则 EvtQuery 返回 ERROR_INVALID_PARAMETER

导出为 XML 必须用 EvtRender + EvtRenderEventXml,不能靠手动拼接

拿到事件句柄后,不能用 GetMessage 或格式化字符串“还原”内容——事件字段是结构化二进制数据,含 SID、GUID、宽字符、多语言字符串等。唯一可靠方式是调用 EvtRender 并指定 EvtRenderEventXml 渲染类型。常见错误是误用 EvtRenderEventValues 后自己组装 XML,结果丢失命名空间、属性顺序错乱、或无法解析 UserData 部分。

关键参数设置:

立即学习“C++免费学习笔记(深入)”;

Windows 图片打印
Windows 图片打印

通过 Python 使用 mspaint /pt 在 Windows 上打印图像——绕过 bash 中文路径编码问题。

下载
  • BufferSize 初始可设为 0,先调 EvtRender 获取所需大小(返回 ERROR_INSUFFICIENT_BUFFER),再分配内存重试
  • 渲染缓冲区必须用 LocalAlloc(LMEM_FIXED) 分配,不能用 new 或 malloc——API 内部可能调用 LocalFree
  • 返回的 XML 是 UTF-16 LE 编码的宽字符串(LPWSTR),若需 UTF-8 文件,必须用 WideCharToMultiByte(CP_UTF8, ...) 转换

权限不足导致 EvtQuery 失败时,错误码通常是 ERROR_ACCESS_DENIED(5)

读取 "Security" 日志需要 SeSecurityPrivilege 权限,默认仅 Administrators 组拥有;读 "Application" 和 "System" 通常只需普通用户权限。但即使有权限,若进程未以“提升权限”方式启动(UAC 弹窗确认),仍会失败。

验证与修复方法:

  • 运行程序前右键 → “以管理员身份运行”,或在 manifest 中声明 requireAdministrator
  • 检查当前 token 是否含对应 privilege:OpenProcessToken + GetTokenInformation(TokenPrivileges, ...)
  • 对 "Security" 日志,还需确保本地策略允许该用户“管理审核和安全日志”(SeSecurityPrivilege)
  • 若仅需读本用户范围事件(如 Microsoft-Windows-PowerShell/Operational),可用 EvtSubscribe 订阅用户会话日志,避免提权

导出大量事件时,EvtNext 循环必须配合分页与超时控制

一次性查几万条事件极易卡死或内存暴涨。Windows 默认单次 EvtNext 最多返回 1024 个句柄,但实际应主动限制批次大小(如 100–500),并加 INFINITE 以外的等待超时(如 5000ms),防止底层服务无响应导致线程挂起。

实操建议:

  • 每次 EvtNext 后立即调 EvtRender 写入文件,不要累积到内存再批量输出
  • 用 FILE_APPEND_DATA 打开输出文件,每次写入前不 fseek,避免磁盘寻道开销
  • 若需完整 XML 文档结构(带 <events></events> 根节点),需在循环外手动写开头/结尾,中间每条事件用 EvtRenderEventXml 输出 <event>...</event>
  • 注意:连续调用 EvtNext 超过约 65535 次可能触发内部句柄泄漏,建议每 10000 条重新 EvtQuery 一次(重置游标)

真正麻烦的不是调通 API,而是处理不同 Windows 版本下 XML Schema 差异(比如 Win7 的 UserData 结构和 Win10/11 不兼容)、权限动态变化、以及 LocalAlloc / LocalFree 生命周期匹配——漏掉一次 LocalFree 就会导致内存泄漏,且很难被 ASan 捕获。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5024

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6517

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2602

2024.11.28

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

15106

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1765

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

4217

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

6381

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1898

2023.08.03

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn