应通过 wevtutil sl 修改日志的 channelaccess sddl 安全描述符来授予特定组读取权限,例如添加 (a;;0x1;;;s-1-5-32-573) 以允许 event log readers 组读取 security 日志,而非直接修改 .evtx 文件 ntfs 权限。
要让特定组能读取 windows 系统日志(如 security、system、application 日志),不能直接对日志文件(如 c:\windows\system32\winevt\logs\*.evtx)赋权——这些文件默认受系统保护,且日志服务通过安全描述符控制访问。正确做法是修改事件日志的注册表安全描述符(sddl),再用 icacls 配合 wevtutil 或直接操作注册表项权限,确保目标组拥有 read 权限。
确认目标日志名称并查看当前访问控制
Windows 事件日志由名称标识(非文件路径),常见日志包括:Security、System、Application、Setup 等。先查该日志当前的安全设置:
- 以管理员身份打开 PowerShell 或 CMD
- 运行:
wevtutil gl Security(将Security替换为你要授权的日志名) - 输出中查找
ChannelAccess字段,它是一段 SDDL 字符串,例如:O:BAG:SYD:(A;;0x1;;;BA)(A;;0x2;;;SO)
向 SDDL 添加指定组的读取权限
读取日志所需最小权限是 0x1(即 GENERIC_READ)。假设你要授予内置组 Event Log Readers(SID:S-1-5-32-573)读取权限:
- 构造新增 ACE:`(A;;0x1;;;S-1-5-32-573)`
- 将它追加到原
ChannelAccess值末尾(注意括号匹配和分号分隔) - 使用
wevtutil sl写回,例如:wevtutil sl Security /ca:O:BAG:SYD:(A;;0x1;;;BA)(A;;0x2;;;SO)(A;;0x1;;;S-1-5-32-573)
⚠️ 注意:wevtutil sl 是修改日志访问策略的官方方式,icacls 对 .evtx 文件本身赋权无效,因为日志服务不依赖文件系统 ACL 作访问判断。
若必须操作底层日志文件(仅限调试/特殊场景)
日志文件实际存于 C:\Windows\System32\winevt\Logs\,但直接改其 NTFS 权限风险高,且重启日志服务后可能被重置。如确需临时测试:
- 停止事件日志服务:
net stop eventlog - 用
icacls授予组读取权限:icacls "C:\Windows\System32\winevt\Logs\Security.evtx" /grant "BUILTIN\Event Log Readers:(R)" - 重启服务:
net start eventlog - ⚠️ 此操作不持久,也不被推荐;生产环境请始终优先使用
wevtutil sl修改 ChannelAccess
验证权限是否生效
授予权限后,让组内用户登录或使用 runas 测试:
- 运行:
wevtutil qe Security /c:1(读取一条 Security 日志) - 若返回事件条目,说明读取成功;若报错
Access is denied,检查 SID 是否拼写正确、日志是否已刷新、是否遗漏/ca:参数 - 也可用 PowerShell:
Get-WinEvent -LogName Security -MaxEvents 1











