控制台历史记录的是什么
PSReadLine 把交互式在 PowerShell 控制台里敲过的命令写入历史文件,位置在用户配置目录下的 PSReadLine 目录中。它记录的是「人敲了什么」,与脚本块日志(记录执行内容)互为补充:一个偏交互操作序列,一个偏实际执行的代码。默认情况下历史文件只保存命令文本,不保存时间戳,因此要确定命令的执行时刻,需要结合进程创建事件与脚本块日志来定位。
基本信息
| 文件位置 | %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt |
|---|---|
| PowerShell 7 | %APPDATA%\Microsoft\PowerShell\PSReadLine\ConsoleHost_history.txt |
| 记录内容 | 交互式输入的命令行文本,按输入顺序追加 |
| 时间信息 | 默认不记录时间戳,需用相邻事件定位时刻 |
| 按用户区分 | 每个用户各自一份,保存在自己的配置目录下 |
| 配套来源 | 脚本块日志(4104)、进程创建事件、终端检测记录 |
典型使用场景
- 还原操作者在控制台上敲过的命令序列
- 确认是否有人手工执行过下载、解码、凭据相关命令
- 与脚本块日志对照:交互输入与脚本执行的差异
- 判断历史文件是否被清理(命令序列出现中断或文件被删除)
- 辅助确认操作者熟练程度与目的(命令的连续性与尝试过程)
- 为访谈与复盘提供时间线上的操作细节
读取与关联
读取与关联
# 读取当前用户的控制台历史(最后 60 条)
Get-Content (Join-Path $env:APPDATA 'Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt') -Tail 60
# 读取其他用户的历史文件需要管理员权限与该用户配置目录
Get-ChildItem 'C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt' |
ForEach-Object { "$($_.FullName) : $((Get-Content $_.FullName).Count) 行, 最后写入 $($_.LastWriteTime)" }
# 查看文件属性:大小与最后写入时间也是线索
Get-Item (Join-Path $env:APPDATA 'Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt') |
Select-Object FullName, Length, LastWriteTime
# 关联:同时间窗内的脚本块与进程创建记录
Get-WinEvent -LogName 'Microsoft-Windows-PowerShell/Operational' -MaxEvents 100 | Where-Object Id -eq 4104 | Select-Object -First 10 TimeCreated判读要点
| 观察项 | 含义 | 异常表现 |
|---|---|---|
| 命令顺序 | 输入序列 | 出现明显跳跃或与脚本日志不匹配 |
| 文件最后写入时间 | 最后一次交互的时间点 | 早于已知入侵时间,说明被替换或清理过 |
| 文件大小与行数 | 历史累积量 | 与使用强度不符,可能被截断或清空 |
| 多用户对照 | 不同账号的操作面 | 服务账号下出现交互式命令,需解释 |
| 命令内容 | 具体动作 | 编码命令、下载执行、凭据相关操作值得重点核查 |
默认不记时间戳,需要结合事件日志定位每条命令的时刻。与 4104 脚本块日志拼接使用:一个偏交互输入,一个偏实际执行内容。
历史文件是普通文本,可以被直接编辑或删除。发现文件缺失、行数异常或最后写入时间可疑时,应转向脚本块日志、进程创建事件与内存痕迹继续取证。