c++怎么在Windows下监控特定文件夹内权限变更的系统日志【底层】

千晨酱_9684

千晨酱_9684

2026-03-28

330人浏览

原创

需先启用“审核对象访问”策略并为目标文件夹配置sacl,再以管理员权限通过evtsubscribe订阅security日志中event id 4670事件,解析其sddl字段比对acl差异来识别具体权限变更。

c++怎么在windows下监控特定文件夹内权限变更的系统日志【底层】

用 Windows API 监控文件夹权限变更需要开启审计策略

Windows 不会默认记录文件或文件夹的权限修改事件(比如 SetAcl、SetSecurityInfo 调用),必须提前配置本地或域策略,否则你在事件日志里根本看不到相关条目。

关键操作是启用「对象访问」审计,并为具体文件夹设置 SACL(系统访问控制列表)——不是 DACL。很多人卡在这一步,以为调用 ReadEventLog 就能直接捞到日志,结果返回空。

  • 打开「组策略编辑器」(gpedit.msc) → 计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 审核策略 → 启用「审核对象访问」(成功/失败都勾)
  • 右键目标文件夹 → 属性 → 安全 → 高级 → 审计 → 添加新条目:选主体为「Everyone」,勾选「更改权限」和「取得所有权」这两项(其他如「创建文件/文件夹」按需)
  • 注意:SACL 修改后,后续所有对该文件夹的权限变更才会被记录;历史操作不会补录

从 Security 日志读取权限变更事件得过滤 Event ID 4670

权限变更在 Windows 事件日志中固定对应 Event ID 4670(“权限已更改”),它属于 Security 日志,不是 Application 或 System。直接用 OpenEventLog 打开 "Security" 即可,但要注意权限问题。

普通用户进程默认无权读取 Security 日志,必须以管理员身份运行,或在 manifest 中声明 requireAdministrator。否则 OpenEventLog 返回 NULL,GetLastError() 是 ERROR_ACCESS_DENIED。

  • Event ID 4670 的 SubjectUserName 字段标识谁改的权限,ObjectName 是被修改的路径,PrivilegeList 通常为空,重点看 AccessList(含旧/新 DACL 的 SDDL 表示)
  • 日志字段是 XML 格式,推荐用 EvtQuery + EvtRender(Windows Vista+)替代老旧的 ReadEventLog,后者不支持结构化数据提取
  • 不要轮询整个日志:用 QUERY_EVENT_LOG_START_AT 配合最后读到的 RecordNumber 增量读取,否则性能极差

用 EvtSubscribe 实现实时响应比轮询更可靠

轮询 Security 日志有延迟且易漏事件(尤其高并发时),Windows 提供基于回调的订阅机制 EvtSubscribe,能真正实时捕获新到达的 4670 事件。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

但必须传入正确的查询字符串,且处理线程需保持活跃——回调函数在你指定的线程上下文中执行,如果主线程退出,订阅自动失效。

  • 查询字符串示例:*[System[(EventID=4670) and TimeCreated[timediff(@SystemTime) (5 分钟内)
  • 回调函数里用 EvtRender 解析 EventRecordId、TimeCreated、ObjectName 等字段,避免手动解析 XML
  • 注意内存泄漏:每次 EvtRender 返回的缓冲区需用 LocalFree 释放;EvtClose 必须成对调用
  • 若程序长期运行,建议每小时重建一次订阅(EvtClose 后重 EvtSubscribe),避免句柄泄漏或事件积压

权限变更日志不包含完整 ACL 差分,只能靠 SDDL 对比

Event ID 4670 日志只记录变更前后的完整 SDDL 字符串(在 AccessList 字段),不提供「哪些 ACE 被增删」这种差分信息。想定位具体哪条权限被改,必须自己解析两段 SDDL 并逐条比对。

别指望 ConvertStringSecurityDescriptorToSecurityDescriptor 后直接 memcmp——SDDL 顺序不保证一致,且可能含冗余空格或注释。稳妥做法是用 GetSecurityDescriptorDacl 提取 DACL,再遍历 ACE 结构体比较 Trustee、AccessMask、AceType。

  • SDDL 解析失败常见于日志字段被截断(长路径或复杂权限),此时 EvtRender 返回 ERROR_INSUFFICIENT_BUFFER,需重试并增大缓冲区
  • 某些第三方工具(如 PowerShell 的 Get-Acl)输出的 SDDL 和事件日志中的格式略有差异,不能直接字符串比对
  • 如果文件夹启用了继承,日志里的 SDDL 会包含 I 标志,但不会告诉你继承源是谁——这得额外查父目录的 DACL

真正难的不是监听,是把一段 SDDL 变成人类可读的「用户 A 被移除了写入权限」。这部分逻辑没有现成 API,得自己写解析和比对逻辑,而且要覆盖所有 ACE 类型(ALLOW、DENY、OBJECT_ALLOW 等)。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

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

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

下载

相关标签:

c++

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1678

6

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

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

2024.04.01

4424

5

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

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

2024.08.01

5717

7

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

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

2024.11.28

2402

7

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

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

2023.08.03

1698

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2564

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6004

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

5469

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习