订阅ETW进程启动事件时,如何获取命令行、工作目录等信息?
获取进程启动详细信息的ETW提供者方案
核心需求对应ETW提供者与字段
你要的命令行、工作目录、进程描述可以通过以下ETW组合实现:
1. 命令行 + 工作目录:Microsoft-Windows-ProcessCreation 提供者
这个提供者专门追踪进程创建的完整上下文,其ProcessStart事件(Event ID 1)直接包含:
CommandLine:完整的进程启动命令行参数CurrentDirectory:进程启动时的工作目录- 额外附带进程ID、父进程ID、可执行文件路径等关键信息
启用与订阅注意:
- 先通过命令开启日志:
wevtutil sl Microsoft-Windows-ProcessCreation/Operational /e:true - 订阅时需指定关键字
0x8000000000000000(对应PROCESS_CREATE事件组)
2. 进程描述:结合ETW事件与文件版本读取
进程描述属于可执行文件的版本资源,无法直接从单一ETW事件获取,可通过两种方式实现:
- 方式一:关联
Microsoft-Windows-Kernel-Image的ImageLoad事件
该事件(Event ID 2)会在进程加载主模块时触发,包含ImageName(可执行文件路径),拿到路径后用脚本读取文件的FileDescription字段。 - 方式二:直接从
Microsoft-Windows-ProcessCreation的事件路径读取
利用ProcessStart事件返回的可执行文件路径,通过PowerShell的Get-ItemProperty或Windows API提取版本信息。
实用PowerShell脚本示例
# 开启ProcessCreation日志(管理员权限执行一次即可) wevtutil sl Microsoft-Windows-ProcessCreation/Operational /e:true # 实时订阅并输出所需字段 Get-WinEvent -FilterHashtable @{ LogName = 'Microsoft-Windows-ProcessCreation/Operational' Id = 1 } -Wait | ForEach-Object { $props = $_.Properties $imagePath = $props[2].Value $fileDesc = if (Test-Path $imagePath) { (Get-ItemProperty -Path $imagePath -ErrorAction SilentlyContinue).FileDescription } else { "无法读取" } [PSCustomObject]@{ 进程ID = $props[0].Value 父进程ID = $props[1].Value 命令行 = $props[5].Value 工作目录 = $props[6].Value 进程描述 = $fileDesc 可执行路径 = $imagePath } | Format-List }
替代方案:补充Microsoft-Windows-Kernel-Process的不足
如果你坚持使用Microsoft-Windows-Kernel-Process的Process Start事件(Event ID 1),可以通过进程ID关联查询:
- 记录事件返回的
ProcessID,再通过WMI的Win32_Process类实时查询命令行、工作目录 - 但这种方式效率低于直接订阅
Microsoft-Windows-ProcessCreation
内容的提问来源于stack exchange,提问作者jrpz
相关产品推荐
相关产品推荐

