powershell远程执行不直接收集日志,而是通过invoke-command等调用远程诊断命令导出日志;需先启用winrm、配置信任主机并验证连通性,再执行get-winevent或wevtutil导出事件日志,或使用tss工具集采集etw等深度日志。
powershell 远程执行本身不直接“收集日志”,而是通过调用远程系统上的诊断工具、事件日志查询命令或专用日志采集脚本,把结果拉回本地。关键在于:先让目标服务器准备好日志数据(如启用 etw 跟踪、导出事件日志),再用 invoke-command 或 enter-pssession 执行对应操作。
确认远程主机已启用 WinRM 并可连接
这是所有远程操作的前提:
- 在目标服务器上以管理员身份运行:
Enable-PSRemoting -Force - 确保 WinRM 服务正在运行:
Get-Service WinRM返回状态为 Running - 若非域环境,需配置信任主机:
Set-Item wsman:localhostclient rustedhosts * -Force,然后重启 WinRM:Restart-Service WinRM - 本地测试连通性:
Test-WsMan -ComputerName Server01成功即表示通道就绪
用 Invoke-Command 直接导出 Windows 事件日志
这是最常用、最轻量的方式,适合快速获取系统、安全、应用等标准日志:
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
- 导出最近 1 小时的系统错误事件:
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddHours(-1)} | Export-Csv -Path "C: empSystemErrors.csv" -NoTypeInformation } - 批量导出多个日志到本地:
Invoke-Command -ComputerName Server01 -ScriptBlock { wevtutil qe System /q:"*[System[(Level=2) and TimeCreated[timediff(@SystemTime) C: empsystem_recent.xml },再用Copy-Item拉回 - 注意:
wevtutil是系统原生命令,无需额外安装;Get-WinEvent更灵活但对权限和日志访问控制更敏感
使用 TSS 工具集远程触发专业诊断日志
当需要 ETW 跟踪、性能计数器、驱动级日志等深度信息时,Microsoft 官方的 Troubleshooting Script Set (TSS) 是首选:
- 先将 TSS.zip 下载解压到本地,再推送到远程服务器(如
Copy-Item TSS -Destination \Server01C$TSS -Recurse) - 远程启动自动日志采集:
Invoke-Command -ComputerName Server01 -ScriptBlock { Set-ExecutionPolicy RemoteSigned -Scope Process -Force; cd C:TSS; .TSS.ps1 -StartAutoLogger } - 复现问题后停止并打包:
Invoke-Command -ComputerName Server01 -ScriptBlock { .TSS.ps1 -Stop; Compress-Archive -Path "C:TSSLogs*" -DestinationPath "C:TSSDiagReport.zip" } - 最后拉回本地分析:
Copy-Item \Server01C$TSSDiagReport.zip .
补充建议:避免常见坑点
实际操作中容易卡住的地方:
-
执行策略限制:远程脚本默认被阻止,务必在远程会话中临时设为
RemoteSigned(进程级即可,不影响系统全局策略) -
权限不足:读取安全日志、启用 ETW 跟踪需
Administrators或Event Log Readers组权限 -
日志路径权限:
Export-Csv写入远程磁盘前,确认目标文件夹存在且当前用户有写入权(推荐写入C: emp并提前创建) -
超时与大日志:导出大量日志时加
-ThrottleLimit 1防止内存溢出;用-AsJob异步执行可规避 PowerShell 默认 3 分钟超时










