《Sysinternals实战指南》ListDLLs Handle 学习笔记(8.11):谁注入了 DLL?谁占着文件不放?一篇教你全搞定
PsTools 学习笔记(7.8):远程连接选项——连接性、超时、会话与安全基线
- 1. 问题背景:PsExec 远程连接为什么经常“看起来能用,现场却翻车”
- 2. PsExec 远程连接的底层通路与前置条件
- 2.1 远程通路的最小验证
- 2.2 必须满足的基础条件
- 3. 远程常用选项:真正该记住的是这些
- 4. 慢链路 / 高丢包场景:稳态参数组合
- 4.1 可靠优先:一次到位
- 4.2 差分热修:最小带宽
- 5. 会话与可见性:-i、-h、-x 的正确理解
- 5.1 查看远端会话
- 5.2 `-x` 要慎用
- 6. PsExec 远程连接流程图:从命令到远端执行
- 7. 常见故障速修表:从症状反推断点
- 8. 安全基线:远程执行不能只追求“跑通”
- 8.1 凭据不要裸奔
- 8.2 端口只对运维范围开放
- 8.3 事后必须清理
- 9. 脚手架模板:复制后按现场改参数
- 9.1 批量稳发:清单文件执行
- 9.2 一次性交互诊断
- 9.3 限权后台执行
- 9.4 远端工作目录固定
- 10. 我的实战判断:PsExec 稳定性的关键不是参数多,而是链路清楚
- 11. 小结
1. 问题背景:PsExec 远程连接为什么经常“看起来能用,现场却翻车”
在 PsTools 家族里,PsExec 是最常用、也最容易被误用的工具。它看起来只是一条远程执行命令,但真正落到企业环境里,背后牵涉 SMB、ADMIN$、RPC、SCM、远程服务、会话隔离、UAC 令牌、防火墙和安全软件拦截。
很多人排查 PsExec 失败时,只盯着一条报错,例如Access is denied、The network path was not found、PSEXESVC could not be installed。这很容易跑偏,因为这些报错只是结果,不是链路本身。
这篇文章的目标不是把 PsExec 参数简单列一遍,而是围绕远程连接选项建立一套可落地的判断框架:先看远程通路,再看连接超时,再看会话可见性,最后看安全基线和故障速修。
下面这张图展示的是本文的整体结构:PsExec 远程连接不是单点动作,而是由连接通路、超时控制、会话交互和安全基线共同组成。
从图中可以看出,PsExec 的稳定性不是靠“多试几次”堆出来的。真正稳定的做法,是先确认 SMB/RPC/会话通道是否成立,再根据慢链路、交互执行、安全隔离等不同场景选择参数组合。
我的判断是:PsExec 排障不要先问“命令怎么写”,而要先问“远端链路是否满足执行条件”。命令只是表层,通路才是根。
2. PsExec 远程连接的底层通路与前置条件
PsExec 不是魔法。它远程执行命令的大致过程可以理解为三步:先通过ADMIN$把远程服务组件复制到目标机,再通过SCM 服务控制管理器创建并启动远程服务,最后由该服务承载远端命令并把输入输出回传回来。
这也是为什么 PsExec 经常会被 445、135、防火墙、EDR、UAC 令牌这些因素影响。只要其中任意一个环节断掉,最终表现出来可能都是“连接失败”或“访问被拒绝”。
这张图展示了 PsExec 远程连接的核心链路:管理端通过 SMB 访问 ADMIN$,再通过 RPC/SCM 创建远端服务,最终在目标主机上运行 PSEXESVC 并执行命令。
从图里能看出,PsExec 的前置条件至少包括四类:ADMIN$ 共享可用、SMB 445 可达、SCM/RPC 可用、具备远端管理员权限。如果你只验证了 ping 通,但没有验证 ADMIN$ 和 SCM,那这个排查是不完整的。
2.1 远程通路的最小验证
现场排查时,我建议不要一上来就执行复杂的 PsExec 命令。先用下面几条命令确认基础链路。
ping PC-001 dir \\PC-001\Admin$ sc \\PC-001 query type= service这三条命令分别验证:目标是否在线、ADMIN$ 是否可访问、SCM/RPC 是否可用。它们比直接上 PsExec 更适合作为第一轮诊断动作。
推荐做法:先验证通路,再执行远程命令。这样失败时能更快定位是网络、权限、共享、RPC,还是安全软件拦截。
2.2 必须满足的基础条件
在企业桌面或服务器环境中,PsExec 稳定运行通常需要满足以下条件:
| 条件 | 说明 | 排查命令 |
|---|---|---|
| SMB 445 可达 | 用于访问 ADMIN$ 和复制组件 | Test-NetConnection PC-001 -Port 445 |
| RPC 135 可达 | 用于远程服务控制 | Test-NetConnection PC-001 -Port 135 |
| ADMIN$ 可访问 | 默认指向远端 Windows 目录 | dir \\PC-001\Admin$ |
| 具备管理员权限 | 用于创建远端服务 | whoami /groups |
| 防火墙允许 | 文件共享、远程服务管理需放行 | netsh advfirewall |
| 安全软件不阻断 | 避免 PSEXESVC 被拦截 | 查看 EDR/杀软日志 |
不要把 ping 通当作 PsExec 可用的证据。ping 只能说明 ICMP 层面有响应,不能证明 SMB、RPC、ADMIN$ 和 SCM 都正常。
3. 远程常用选项:真正该记住的是这些
PsExec 参数很多,但现场使用不应该把它当成背参数表。远程连接相关参数可以按四类理解:目标、凭据、连接稳定性、执行上下文。
| 选项 | 作用 | 使用建议 |
|---|---|---|
\\host | 指定目标主机 | 单机执行最常见 |
\\@list.txt | 从清单批量读取主机 | 适合批量运维 |
-u user | 指定远端登录用户名 | 推荐域账号或受控运维账号 |
-p pass | 指定密码 | 不建议明文写入命令行 |
-n N | 连接超时,单位秒 | 慢链路建议调大 |
-c | 复制本地程序到远端再执行 | 适合远端没有工具的情况 |
-f | 强制覆盖远端文件 | 部署固定版本时使用 |
-v | 仅版本更新时复制 | 节省带宽,适合慢链路 |
-r name | 自定义远端服务名 | 避免默认 PSEXESVC 被策略命中 |
-i | 指定交互会话 | 需要 UI 可见时使用 |
-h | 使用高完整性令牌 | 管理员账户在 UAC 环境下常用 |
-d | 不等待远端进程结束 | 后台投递使用 |
-w dir | 指定远端工作目录 | 避免相对路径和日志路径异常 |
一个比较典型的远程执行命令如下:
psexec \\app-01 -u domain\op -p ***** -n 45 -c -v -w C:\ops job.exe -arg1 -arg2这条命令的重点不是“参数多”,而是它同时解决了几个现场问题:指定凭据、放宽连接超时、复制工具、只在版本更新时复制,并把工作目录固定到 `C:\ops`。
PsExec 参数组合要围绕场景设计。慢链路、交互界面、后台投递、批量部署、安全审计,参数组合都不一样。
4. 慢链路 / 高丢包场景:稳态参数组合
分支机构、异地机房、VPN、弱网环境下,PsExec 最容易出现连接超时、复制中断、执行结果不稳定等问题。这个时候不能只靠重复执行,而应该从参数层面做稳态设计。
这张图展示的是慢链路下的典型稳态组合:延长连接超时、减少重复复制、使用自定义服务名、后台投递任务,让任务尽量不被临时网络抖动打断。
从图中能看到,慢链路排障不是单纯“把超时时间调大”。更稳的组合是:`-n` 负责连接容忍度,`-c -v` 负责减少传输成本,`-r` 负责服务名可控,`-d` 负责避免本地会话长时间阻塞。
4.1 可靠优先:一次到位
psexec \\edge-01 -n 90 -c -f -v -r psexec_opsvc -d ^ -w C:\ops\pkg deploy.exe /silent /log C:\ops\log\deploy.log这组参数适合边缘节点或弱网分支:
-n 90:将连接超时拉长到 90 秒;-c -f -v:复制程序、必要时覆盖、仅高版本复制;-r psexec_opsvc:自定义远端服务名,便于排查;-d:后台执行,避免本地控制台一直等待;-w C:\ops\pkg:固定远端工作目录,避免相对路径错位。
推荐用于:弱网分支部署、远程修复包投递、远端维护窗口内的无人值守执行。
4.2 差分热修:最小带宽
psexec \\branch-05 -n 75 -c patch.dll -v rundll32.exe patch.dll,Entry如果只是投递一个小补丁或小组件,`-v` 很有价值。它可以避免每次都重复复制相同文件,尤其适合带宽有限的场景。
弱网环境下,不建议同时批量推送大文件到大量主机。先小范围试点,再分批执行,否则失败后很难判断是网络抖动、远端权限,还是安全软件阻断。
5. 会话与可见性:-i、-h、-x 的正确理解
PsExec 远程执行成功,不代表用户桌面一定看得到界面。Windows 从 Vista 之后引入 Session 0 隔离,服务运行在 Session 0,而用户桌面通常在 Session 1、Session 2 或更高编号的会话中。
所以当你远程执行一个带界面的程序,却发现“进程有了,界面没出现”,不一定是程序没启动,也可能是它启动在了错误的会话里。
这张图展示了 PsExec 会话与可见性的关系:Session 0 是隔离的系统会话,用户真正能看到和交互的是登录后的用户会话,必要时需要使用 `-i` 指定目标会话,并配合 `-h` 使用高完整性令牌。
从图中可以看出,Session 0 与用户会话是隔离的。想让 UI 真正显示在用户桌面,必须先确认目标用户在哪个 Session,再决定是否使用 `-i `。如果涉及管理员界面或需要提升令牌,还要配合 `-h`。
5.1 查看远端会话
query session /server:PC-001如果目标用户在 Session 2,可以这样执行:
psexec \\PC-001 -i 2 -h cmd.exe如果你只是执行后台脚本,不需要界面,那么不要随便加 `-i`。交互式执行适合诊断,不适合所有批量运维任务。
5.2-x要慎用
`-x` 用于在 Winlogon 安全桌面显示界面,这个参数不是常规运维动作。它适合非常少数需要安全桌面上下文的场景,不建议普通脚本批量使用。
不要把 `-i` 当成万能参数。很多服务端任务本来就不应该显示 UI,强行交互反而会引入会话、权限和安全风险。
6. PsExec 远程连接流程图:从命令到远端执行
为了把前面的内容串起来,可以把 PsExec 远程执行理解为下面这条链路。只要链路中的某一环断掉,最终就可能表现为连接失败、访问拒绝、服务安装失败、进程启动但无输出。
这个流程图的价值在于,它能让排障从“猜报错”变成“查链路”。你可以按照 DNS、SMB、ADMIN$、RPC、SCM、安全软件、执行结果这个顺序逐项排除。
这也是 Mark 式排障里很重要的一点:用户看到的是报错,工程师要还原的是链路。报错不是根因,链路断点才是根因候选。
7. 常见故障速修表:从症状反推断点
PsExec 的报错很多,但真正高频的根因并不多。排查时不要被英文报错吓住,先判断它属于网络路径、权限令牌、服务创建、会话显示,还是远端路径问题。
| 报错 / 现象 | 高概率原因 | 处理建议 |
|---|---|---|
Access is denied. | 非管理员、UAC 远程限制、SMB 会话冲突 | 核对管理员权限;清理net use;必要时评估LocalAccountTokenFilterPolicy |
The network path was not found. | DNS、路由、SMB 445 不通 | 用 IP 测试;检查 445;确认文件共享启用 |
The RPC server is unavailable. | RPC 135 或动态端口被拦 | 放行远程服务管理规则;检查防火墙策略 |
PSEXESVC could not be installed | ADMIN$ 不可写、杀软拦截、权限不足 | 检查 ADMIN$;改用管理员;查看 EDR 日志 |
| 进程启动但没 UI | 没有指定用户会话或缺少高完整性令牌 | 使用query session,再配合-i <id> -h |
| 命令偶发卡住 | 慢链路、高延迟、管道输出过大 | 加大-n;使用-d;减少输出回传 |
| 远端找不到文件 | 没有-c,远端 PATH 或工作目录不对 | 加-c或指定-w工作目录 |
这里有一个经验判断:如果错误是“路径找不到”,优先查名称解析和 445;如果是“访问拒绝”,优先查账号权限、UAC 令牌和 ADMIN$;如果是“服务安装失败”,优先查 SCM、杀软和远端系统目录写入权限。
8. 安全基线:远程执行不能只追求“跑通”
PsExec 的能力很强,但它的风险也很直接:远程复制、远程创建服务、远程执行进程。这些动作在安全软件、EDR、审计系统眼里都属于高敏行为。所以生产环境使用 PsExec,必须有安全基线。
这张图展示了 PsExec 使用时应该同时关注的两条线:左边是最小权限、凭据安全、审计日志、防火墙和服务清理;右边是快速排障路径,帮助你在不扩大风险面的情况下恢复业务。
从图中能看出,安全不是最后才补的“注意事项”,而是远程执行设计的一部分。真正稳的做法,是策略先行、持续加固,遇到故障时快速定位,恢复后及时清理。
8.1 凭据不要裸奔
命令行里直接写 `-p 密码` 是最直观的做法,但它也是最不推荐的做法。密码可能出现在命令历史、脚本文件、进程命令行快照、日志系统里。
推荐优先使用当前域身份、交互输入密码、受控运维账号、cmdkey、LAPS 或企业密管系统。
8.2 端口只对运维范围开放
PsExec 需要 SMB 和 RPC,但这不代表要对所有网段开放。企业环境里更合理的方式是只对运维网段、跳板机或受控管理终端开放必要端口。
Test-NetConnectionPC-001-Port 445Test-NetConnectionPC-001-Port 1358.3 事后必须清理
任务完成后,建议检查是否有残留服务、残留文件和残留凭据。
sc \\PC-001 query PSEXESVC sc \\PC-001 delete PSEXESVC net use \\PC-001\IPC$ /delete cmdkey /delete:PC-001不要在终端上长期保留临时放开的安全策略、明文凭据、残留服务或无审计的远程执行通道。
9. 脚手架模板:复制后按现场改参数
下面给几组现场常用模板。实际使用时不要直接盲跑,至少要改主机名、账号、路径和日志目录。
9.1 批量稳发:清单文件执行
for /f %%H in (hosts.txt) do ( psexec \\%%H -n 75 -c -v -w C:\ops -r opsvc -d agent.exe -install )这个模板适合把一个工具或代理部署到多台终端。`-n 75` 提高弱网容忍度,`-c -v` 控制复制行为,`-r opsvc` 让服务名可控,`-d` 后台投递。
9.2 一次性交互诊断
psexec \\host -i 1 -h powershell.exe -NoLogo -NoProfile这个模板适合你需要在远端用户会话里做一次交互诊断时使用。注意先确认 Session ID,不要默认所有机器都是 Session 1。
9.3 限权后台执行
psexec \\app -l -belownormal -d -w C:\tasks task.exe /q这个模板适合后台低干扰任务。`-l` 限制权限,`-belownormal` 降低调度优先级,适合非紧急作业。
9.4 远端工作目录固定
psexec \\PC-001 -w C:\Temp cmd /c "whoami > result.txt"如果程序依赖相对路径、配置文件或本地日志,`-w` 很关键。很多“远程能启动但行为异常”的问题,本质上就是工作目录不对。
10. 我的实战判断:PsExec 稳定性的关键不是参数多,而是链路清楚
PsExec 的远程连接选项,表面看是参数问题,实际是企业运维里的链路控制问题。你要知道命令从哪里发出,经过什么端口,依赖什么共享,用什么权限,在远端创建什么服务,最后在哪个会话里运行。
如果只是为了“跑一次命令”,最简单的写法当然能用。但如果要做批量运维、远程修复、弱网部署、交互诊断,就必须把连接、超时、会话、安全四件事分开看。
我的建议可以收束为四句话:
- 先测通路:DNS、445、ADMIN$、RPC、SCM;
- 再选参数:慢链路用
-n,复制用-c/-v,后台用-d,会话用-i; - 控制权限:不要明文密码,不要长期放宽 UAC 和防火墙;
- 保留证据:日志、退出码、远端执行结果都要能回看。
PsExec 是一把很锋利的运维工具。锋利本身不是问题,不知道它切到了哪一层才是问题。
11. 小结
本文围绕 PsExec 远程连接选项,梳理了底层通路、常用参数、慢链路稳态组合、会话与可见性、安全基线和故障速修。真正要带走的不是某个单独参数,而是一套判断顺序。
当 PsExec 失败时,不要直接怀疑工具,也不要反复试命令。先按链路排:名称解析是否正常,SMB 是否可达,ADMIN$ 是否可写,RPC/SCM 是否可用,账号是否具备管理员权限,EDR 是否拦截,目标会话是否正确。
当 PsExec 能跑通时,也不要忽略安全。远程执行本身就是高权限动作,必须做到凭据可控、端口可控、日志可追溯、服务可清理。
把 PsExec 用稳的关键,是把它从“一条远程命令”升级成“一套可审计、可验证、可回滚的远程执行流程”。
🔝 返回顶部
点击回到顶部
