PsLoggedOn(7.17):谁在登录?多会话取证与审计
PsLoggedOn(7.17):谁在登录?多会话取证与审计
- PsLoggedOn(7.17):谁在登录?多会话取证与审计
- 你将收获
- 1)PsLoggedOn 是什么?
- 2)典型使用场景
- 3)快速开始(命令最小集)
- 4)示例输出与解读
- 5)与其他命令/工具交叉验证
- 6)事件日志取证(时间维度还原)
- 7)常见报错与速修
- 8)批量审计脚本(PowerShell,CSV 落盘)
- 9)最佳实践清单
- 10)小结
PsLoggedOn(7.17):谁在登录?多会话取证与审计
目标:一眼看清 某台 Windows 上当前有哪些账号处于“登录状态”(含本地交互、RDP 会话、网络共享连接),并把这一结论用于安全审计、取证与运维排障。
你将收获
- 搞清 PsLoggedOn 能“看见”的三类登录:本地交互 / 远程交互(RDP)/ 网络会话(共享)
- 正确解读输出,区分 当前会话 与 历史足迹
- 典型排障与取证流程(含事件日志编码:4624/4634/4778/4779)
- 可直接落地的 批量审计脚本 与 常见报错速修
1)PsLoggedOn 是什么?
PsLoggedOn(Sysinternals) 用来显示:
- 本地交互式登录(键鼠在主机前/控制台)
- 远程交互式登录(RDP/终端服务会话)
- 网络登录(访问共享、打开文件导致的会话)
和 query user / qwinsta 只看交互会话不同,PsLoggedOn 还能列出仅通过网络访问该主机资源的用户,这在审计“谁在占用共享”“是谁从文件服务器上打开了这个文件”时非常关键。
2)典型使用场景
- 安全审计:发现异常的域账号正登录/连到关键服务器
- 应急取证:某时间段“谁连过这台机/打开过共享”
- 文件被占用:定位是哪个用户在远程占用文件/目录
- RDP 多会话治理:清点同一台机器上的多名/多会话登录
3)快速开始(命令最小集)
:: 查看本机上谁在登录
psloggedon:: 查看远程主机
psloggedon \\HOSTNAME:: 仅看“交互式登录”(常见开关,具体以 psloggedon -? 为准)
psloggedon -l \\HOSTNAME
解读要点
- 交互式:本地/远程桌面会话(对应 4624 LogonType=2/10)
- 网络:通过 SMB 打开的会话(对应 4624 LogonType=3)
- 已断开但未注销 的 RDP 会话通常仍会显示(会话驻留)
4)示例输出与解读
Users logged on locally:CORP\alice (console)CORP\bob (rdp-tcp#15)Users logged on via resource shares:CORP\buildsvcGUEST
console→ 物理交互rdp-tcp#15→ 远程桌面会话 ID- “via resource shares” → 该账号正在通过 网络共享 访问本机资源(即使没有打开桌面会话)
5)与其他命令/工具交叉验证
| 目的 | 命令 | 说明 |
|---|---|---|
| 交互式会话列表 | query user / qwinsta | 看谁在 RDP/控制台 |
| 网络会话 | net session / psfile | 谁通过 SMB 连接、打开了哪些文件 |
| 安全日志 | wevtutil / PsLogList | 4624/4634/4778/4779 取证(见下) |
| WMI 快照 | wmic /node:HOST COMPUTERSYSTEM GET USERNAME | 当前控制台用户(单点) |
推荐:PsLoggedOn +
query user+net session三件套,交叉印证“交互 + 网络”。
6)事件日志取证(时间维度还原)
关键事件(安全日志 / Security):
-
4624:成功登录(看
Logon Type)- 2 = 交互式(本地)
- 3 = 网络(共享/映射盘)
- 10 = 远程交互式(RDP)
-
4634:注销
-
4778/4779:RDP 会话重新连接/断开
-
4647:用户主动注销
快速导出(PsLogList 示例):
:: 抓取过去 1 天 RDP/网络相关登录事件
psloglist \\HOSTNAME -s -i 4624,4634,4647,4778,4779 -d 1 -o csv > HOSTNAME_logons.csv
7)常见报错与速修
| 报错 | 常见原因 | 快速修复 |
|---|---|---|
| Access is denied. | 远程非管理员/UAC 限制/ADMIN$ 关闭 | 使用管理员凭据;必要时放宽工作组 UAC 限制;开启管理共享 |
| The RPC server is unavailable. | 135/动态 RPC 被拦、防火墙/设备离线 | 放行端口;检查在线性;Test-NetConnection HOST -Port 135 |
| The network path was not found. | DNS/NetBIOS 不通、未入网 | 校验解析、连通性与路由 |
| 输出缺少网络会话 | 服务/共享关闭,无人通过 SMB | 用 net session/psfile 交叉确认;有人可能只 RDP 未开文件 |
工作组 UAC 限制(可选,慎用)
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System ^/v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
8)批量审计脚本(PowerShell,CSV 落盘)
# 批量清点一组主机的交互/网络登录用户(调用 PsLoggedOn)
param([Parameter(Mandatory=$true)][string[]]$Hosts)$results = @()
foreach($h in $Hosts){Write-Host ">>> $h" -ForegroundColor Cyan$txt = cmd /c "psloggedon \\$h" 2>&1if($LASTEXITCODE -ne 0){ $results += [pscustomobject]@{Host=$h; Type='Error'; Account=$txt.Trim(); Session=''; When=Get-Date}continue}$block=''; $type=''foreach($line in $txt){if($line -match '^Users logged on locally') { $type='Local'; continue }if($line -match '^Users logged on via resource shares') { $type='Network'; continue }if($line -match '^\s*$') { continue }if($line -match '^\s+(.+?)(\s+\((.+)\))?$'){$acc=$matches[1].Trim()$sess= if($matches[3]){$matches[3]} else {''}$results += [pscustomobject]@{Host=$h; Type=$type; Account=$acc; Session=$sess; When=Get-Date}}}
}
$path = ".\psloggedon_audit_{0:yyyyMMdd_HHmmss}.csv" -f (Get-Date)
$results | Export-Csv -NoTypeInformation -Encoding UTF8 -Path $path
Write-Host "Saved to $path" -ForegroundColor Green
用法示例:
.\audit.ps1 -Hosts @('FS01','APP02','DB03')
9)最佳实践清单
- 最小权限:尽量用只读权限审计,写操作另走审批
- 合规保密:登录审计涉及个人信息,按制度取用,最少化留存
- 交叉印证:PsLoggedOn +
query user+net session+ 安全日志 - 会话治理:RDP 会话长期断开未注销(
Disc)要设 Idle/Disconnect Policy - 纳管脚本:批量审计脚本纳入运维平台/堡垒机,留痕可追溯
10)小结
- PsLoggedOn 解决的是“现在谁在这台机上”的问题,既看得到 交互会话,也看得到 网络会话。
- 与会话命令、共享会话、安全日志 结合,就能从 “瞬时态 + 时间轴” 两个维度完成完整审计。
- 建议把本文脚本与流程固化到你的 日常巡检 / 应急取证 SOP 中,提升排障与审计效率。
下一篇:PsLogList(7.18):远程读取事件日志的筛选与导出 —— 带你把 4624/4634/4778/4779 拉齐做时间轴分析。
