PsTools 学习笔记(7.10):PsFile——远程“谁在占用这个文件/共享”的取证与解占用
PsTools 学习笔记(7.10):PsFile——远程“谁在占用这个文件/共享”的取证与解占用
- PsTools 学习笔记(7.10):PsFile——远程“谁在占用这个文件/共享”的取证与解占用
- 一、PsFile 能做什么
- 二、快速上手(最常用 3 招)
- 1)查看本机被远程打开的文件
- 2)查看某台文件服务器(或任何 SMB 共享服务器)
- 3)关闭指定 ID(**释放占用**)
- 三、输出怎么读?定位“元凶”的两条线
- 四、脚本化场景与范式
- 场景 A:**无法删除目录,定位并释放被占用文件**
- 场景 B:**批量关闭某个共享下的所有占用(风险:会踢掉他人会话)**
- 场景 C:**按用户强制释放其“所有占用”**
- 五、常见报错与排障
- 六、与其他 Sysinternals 工具协同
- 七、最佳实践清单
- 八、常用命令速查
- 小结
PsTools 学习笔记(7.10):PsFile——远程“谁在占用这个文件/共享”的取证与解占用
“这个 Excel 一直提示‘文件正在使用’,谁在占用?”
“共享目录删不掉,说‘文件正由另一程序使用’——到底哪台机器在开?”
——这些典型运维难题,用 PsFile 三步就能搞定:枚举 → 定位 → 释放。
一、PsFile 能做什么
- 枚举:列出被远程 SMB 客户端打开的文件/管道/打印作业等资源(本机或远程服务器)。
- 溯源:看到占用者(会话/用户) 与 被打开的路径,辅助审计与追责。
- 解占用:按 ID 精确关闭 某个文件句柄;必要时可批量关闭。
对标 GUI:计算机管理 → 系统工具 → 共享文件夹 → 打开的文件。
优势:脚本化、可批量、可远程。
二、快速上手(最常用 3 招)
1)查看本机被远程打开的文件
psfile
常见输出信息包含:ID / 用户 / 打开的文件路径 / 访问类型(读/写)/ 锁定数(不同版本列名略有差异)。
2)查看某台文件服务器(或任何 SMB 共享服务器)
psfile \\filesrv
:: 或带凭据
psfile \\filesrv -u DOMAIN\Admin -p ********
3)关闭指定 ID(释放占用)
:: 先 psfile 找到目标条目的 ID(例:128)
psfile \\filesrv 128 -c
- 一般需要在目标服务器上具备管理员权限。
- 关闭的是远程会话对该文件的打开句柄,不会删除文件本身。
三、输出怎么读?定位“元凶”的两条线
-
按文件线索反查“谁开着”
-
用
findstr快速过滤:psfile \\filesrv | findstr /I "\\filesrv\share\project.docx" -
拿到 ID 与 User/Session,再决定是否
-c关闭。
-
-
按用户/终端线索反查“打开了什么”
-
某个帐号一直“忘关文件”?直接按用户过滤:
psfile \\filesrv | findstr /I "zhangsan" -
批量列出该用户所有占用,评估风险后再处理。
-
四、脚本化场景与范式
场景 A:无法删除目录,定位并释放被占用文件
:: 1) 定位具体占用条目(文件名可能包含空格,findstr 模糊匹配)
psfile \\filesrv | findstr /I "\\filesrv\share\Design":: 2) 假设返回多条,人工确认 ID 后逐条关闭
psfile \\filesrv 124 -c
psfile \\filesrv 128 -c:: 3) 再执行删除
robocopy \\filesrv\share\Design NUL /PURGE /MIR
场景 B:批量关闭某个共享下的所有占用(风险:会踢掉他人会话)
for /f "tokens=1" %i in ('psfile \\filesrv ^| findstr /I "\\filesrv\share\Public"') do @(rem 简化演示:假设 tokens=1 能解析出 ID(不同版本列宽可能不同,生产建议先 parse)psfile \\filesrv %i -c
)
风险提示:请先备份输出并人工确认,避免误关正在写入的生产文件。
场景 C:按用户强制释放其“所有占用”
for /f "tokens=1,*" %i in ('psfile \\filesrv ^| findstr /I "zhangsan"') do @psfile \\filesrv %i -c
建议先仅打印
echo psfile \\filesrv %i -c进行“干跑(dry-run)”,确认 ID 解析无误后再执行。
五、常见报错与排障
| 现象/报错 | 可能原因 | 处理建议 |
|---|---|---|
Access is denied | 权限不足 | 在 目标服务器上用管理员执行;或加 -u/-p 指定域管或本地管理员 |
The network path was not found | 名称解析/防火墙/SMB 被禁 | ping/nslookup 检查解析,开放 445/TCP;确认“服务器/工作站”服务正常 |
| 看不到本机本地进程占用 | PsFile 只显示远程 SMB 打开的文件 | 本地进程句柄请用 Handle.exe、Process Explorer、ProcMon |
| 关闭后仍提示占用 | 应用层维护了二次锁/缓存 | 终止客户端进程或断开其 SMB 会话;必要时踢会话(计算机管理→共享文件夹→会话) |
六、与其他 Sysinternals 工具协同
- Handle.exe:定位本地进程的文件/句柄(
handle -a file.txt/handle -p pid)。 - Process Explorer:在进程属性的 Handles 页签里搜索路径,找哪个进程占有。
- ProcMon:追踪实时 I/O,分析谁在持续访问导致无法删除/移动。
- PsExec:远程执行上面这几种工具,做“跨机诊断闭环”。
组合拳示例:
psfile定位 →psexec \\client handle.exe确认客户端谁持有 → 与用户沟通/强制结束。
七、最佳实践清单
- 先查再关:任何
-c操作前,都先保存psfile原始输出做审计。 - 最小化影响面:优先关闭单个 ID,不要一上来就批量全关。
- 善用过滤:
findstr/Select-String(PowerShell)快速定位。 - 权限模型清晰:在资源服务器侧执行,使用管理员上下文。
- 自动化要容错:输出列宽随版本变化,脚本解析 ID 时请做健壮匹配/校验。
八、常用命令速查
:: 列出本机被远程打开的文件
psfile:: 查看指定服务器的远程打开文件(带凭据)
psfile \\filesrv -u DOMAIN\Admin -p ********:: 关闭某个占用(按 ID)
psfile \\filesrv 128 -c:: 只看某共享下的占用(模糊筛)
psfile \\filesrv | findstr /I "\\filesrv\share\Finance":: 批量关闭(执行前先 dry-run)
for /f "tokens=1" %i in ('psfile \\filesrv ^| findstr /I "Finance"') do @echo psfile \\filesrv %i -c
小结
PsFile 是处理 SMB 共享“文件被占用”问题的首选命令行工具:
- 快速列出“谁”在“哪里”“怎么”打开;
- 支持按 ID 精准关闭占用;
- 与 Handle/ProcMon/Process Explorer 联动,形成端到端取证闭环。
下一篇(7.11):PsGetSid——从安全标识角度理解账户/对象的“真实身份”,以及跨域/跨林排障的实战用法。
