Windows远程PowerShell审计需启用高级审核策略与脚本块日志,结合Security与PowerShell日志交叉分析源IP、命令及会话生命周期,并启用WinRM转录保障日志完整性。
windows 远程 powershell 访问记录审计,核心在于捕获完整会话上下文——不只是“谁连了”,更要明确“从哪来、执行了什么、何时断开”。默认日志只留痕迹,不存命令;必须主动配置才能获得可追溯的审计证据。
启用 WinRM 会话级命令行审计
PowerShell 远程会话(基于 WinRM)默认不记录具体命令,需开启高级审核策略并配合注册表设置:
- 进入「组策略编辑器」→ 计算机配置 → 策略 → Windows 设置 → 安全设置 → 高级审核策略配置 → 系统审核策略 → 详细跟踪 → 启用「进程创建」并勾选「包含命令行参数」
- 同时确保注册表项
HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging的EnableScriptBlockLogging值为1 - 重启 WinRM 服务(
Restart-Service winrm)后,事件日志中 ID 4104(脚本块执行)和 ID 4103(命令启动)将包含完整命令文本与调用者 SID
提取远程会话元数据与源 IP
仅靠事件日志无法自动关联源地址,需组合多个日志通道:
-
Get-WinEvent -LogName "Microsoft-Windows-Windows PowerShell" -FilterXPath "*[System[(EventID=4104)]]"获取命令内容 -
Get-WinEvent -LogName "Security" -FilterXPath "*[System[(EventID=4624) and (Data[@Name='LogonType']='3')]]"提取远程登录事件,其中Properties[18]是源 IP(NLA 启用时可靠) -
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational"中 ID 100(会话建立)、ID 103(会话关闭)提供连接生命周期时间戳与客户端主机名
海外或高延迟环境下的日志保全方案
跨境远程会话易因网络抖动导致日志丢失。建议启用 WinRM 会话转录(Transcript)并本地落盘:
- 在
WSMan:\localhost\Service下设置:Set-Item WSMan:\localhost\Service\EnableCompatibilityMode -Value $true Set-Item WSMan:\localhost\Service\TranscriptsDirectory -Value "C:\WinRMTranscripts" Set-Item WSMan:\localhost\Service\EnableTranscripting -Value $true
- 每次远程会话将生成带时间戳的
.txt文件,含完整输入输出流,不受事件日志缓冲区限制 - 配合 NTP 同步(
w32tm /resync),确保跨时区时间戳对齐
关联分析与异常识别技巧
单条日志价值有限,关键在交叉验证:
- 将
Security日志中 4624(登录)的SubjectLogonId,与PowerShell/Operational日志中 100 事件的ActivityId字段比对,确认是否为同一会话 - 若某 IP 在 4624 中出现,但
PowerShell/Operational无对应 100 事件 → 可能是认证成功但未启动 PowerShell 会话(如仅用 MMC 远程管理) - 出现大量 ID 4104 但无 ID 103(会话关闭)→ 会话异常中断,需排查网络或攻击行为
不复杂但容易忽略











