如何配置Windows事件日志以记录PowerShell脚本的签名状态、哈希等详细信息?
如何配置Windows事件日志以记录PowerShell脚本的签名状态、哈希等详细信息?
我完全理解你的困扰——在逐步过渡到全签名脚本的过程中,确实需要先摸清现有环境里未签名脚本的分布,同时又不想一下子锁死系统影响业务。下面是几种可行的配置方法,能让Windows事件日志记录你需要的详细信息:
一、启用PowerShell脚本块日志(Script Block Logging)
这是最直接获取脚本哈希和签名状态的方式,它会捕获执行的脚本块的唯一哈希值,以及签名验证的相关结果:
- 配置路径:
可以通过组策略编辑器(gpedit.msc)操作:依次进入「计算机配置 > 管理模板 > Windows组件 > Windows PowerShell」,找到「开启脚本块日志记录」并启用。建议同时勾选「记录脚本块Invocation详细信息」,这样能获取更完整的上下文。
如果是单台机器,也可以直接修改注册表:在HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging下,将EnableScriptBlockLogging和EnableScriptBlockInvocationLogging都设为1。 - 对应事件ID:
日志会出现在「应用程序和服务日志 > Microsoft > Windows > PowerShell > Operational」中,事件ID为4104。在事件的详细信息里,你能找到ScriptBlockId(这就是脚本块的SHA256哈希),如果脚本是签名的,还会包含签名有效性的相关字段。
二、启用PowerShell模块日志(Module Logging)
这个配置能记录脚本执行时的模块加载、签名验证等更细致的上下文,尤其适合追踪未签名脚本的执行场景:
- 配置路径:
同样在组策略里的「Windows PowerShell」节点下,找到「开启模块日志记录」并启用,然后在「要记录的模块名称」里填入*(通配符)来记录所有模块的活动。
注册表对应路径是HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging,设置EnableModuleLogging为1,并在ModuleNames里添加*。 - 对应事件ID:
事件ID为4103,在事件内容里会明确记录脚本的签名状态——比如如果执行了未签名脚本,会出现类似「未找到有效的数字签名」的提示信息;如果是签名脚本,会记录签名是否通过验证。
三、配合ExecutionPolicy优化日志效果(无需设为Restricted)
你不需要直接把ExecutionPolicy设为Restricted来强制签名验证,建议保持当前的策略(比如RemoteSigned),同时结合上面的日志配置:
- 当执行本地未签名脚本时,即使ExecutionPolicy允许运行,日志依然会记录这个脚本的哈希以及签名缺失的状态;
- 当执行签名脚本时,日志会同步记录签名的有效性(比如是否过期、是否来自可信发布者)。
四、快速提取日志中的关键信息
可以用一段PowerShell脚本筛选并整理这些日志,方便你快速查看脚本的哈希和签名状态:
Get-WinEvent -LogName 'Microsoft-Windows-PowerShell/Operational' | Where-Object { $_.Id -in 4103, 4104 } | ForEach-Object { $eventXml = [xml]$_.ToXml() $dataNodes = $eventXml.Event.EventData.Data # 提取脚本哈希 $scriptHash = ($dataNodes | Where-Object { $_.Name -eq 'ScriptBlockId' }).'#text' # 提取签名状态(部分事件可能没有,做兼容处理) $signatureStatus = ($dataNodes | Where-Object { $_.Name -eq 'SignatureStatus' }).'#text' if (-not $signatureStatus) { $signatureStatus = '未签名或签名状态未记录' } [PSCustomObject]@{ 执行时间 = $_.TimeCreated 事件ID = $_.Id 脚本哈希 = $scriptHash 签名状态 = $signatureStatus 事件摘要 = $_.Message -split "`n" | Select-Object -First 3 } } | Sort-Object 执行时间 -Descending
注意事项
- 这些日志会增加事件日志的体积,记得在「事件查看器」里配置合适的日志轮转策略(比如设置最大日志大小、超过时自动覆盖旧日志);
- 脚本块日志可能会记录脚本中的敏感信息(如明文密码),一定要严格控制事件日志的访问权限,只允许授权人员查看。
备注:内容来源于stack exchange,提问作者user1667906
相关产品推荐
相关产品推荐

