《Windows Sysinternals实战指南》Tools 学习笔记(7.6):PsExec 命令行选项全图鉴(含最佳实践与模板)
PsTools 学习笔记(7.6):PsExec 命令行选项全图鉴(含最佳实践与模板)
- 1. 这篇文章解决什么问题
- 2. 先建立全局视角:PsExec 选项不是一堆散乱参数
- 3. 身份与权限:先决定用什么身份运行
- 3.1 `-u` 与 `-p`:指定备用凭据
- 3.2 `-h`:使用高完整性令牌,不是提权按钮
- 3.3 `-s`:以 Local System 身份运行
- 3.4 `-l`:以受限用户运行
- 3.5 `-e`:不加载用户配置文件
- 4. 交互与桌面会话:不要误以为远程执行一定能显示界面
- 4.1 `-i [session]`:指定交互会话
- 4.2 `-x`:Winlogon 安全桌面,谨慎使用
- 5. 复制、执行与流程控制:决定程序怎么跑
- 5.1 `-c`:复制本地程序到远端再执行
- 5.2 `-f` 与 `-v`:控制复制覆盖策略
- 5.3 `-d`:不等待远端进程结束
- 5.4 `-w`:指定远端工作目录
- 5.5 `-n`:设置连接超时
- 6. 常用命令组合模板
- 6.1 单机远程打开高完整性 CMD
- 6.2 推送工具并后台执行
- 6.3 SYSTEM 身份运行并写本地日志
- 6.4 IPC 会话建立、执行、清理
- 6.5 自定义远端服务名
- 7. 常见报错:不要只盯着密码看
- 7.1 `Access is denied.`
- 7.2 `Make sure that the default admin$ share is enabled...`
- 7.3 `PSEXESVC could not be installed`
- 7.4 UI 不显示
- 8. 安全基线与速查表:把 PsExec 用成可审计工具
- 8.1 不要写明文密码
- 8.2 保留审计线索
- 8.3 清理远端服务和会话
- 8.4 PsExec 参数速查
- 9. 我的实战建议
- 10. 小结
1. 这篇文章解决什么问题
PsExec 是 PsTools 里使用频率最高、也最容易踩坑的工具。它可以远程执行命令、推送程序、切换运行身份、进入交互会话、以 SYSTEM 权限运行任务,还可以配合脚本做批量运维。
但问题也正出在这里:PsExec 的选项很多,如果只靠死记,很容易把参数拼错。比如 `-d` 会让命令异步执行,导致你拿不到远端程序真正的退出码;`-h` 不是提权按钮,只是使用高完整性令牌;`-s` 虽然权限很高,但访问网络共享时反而可能失败。
所以这篇文章不按官方帮助顺序机械罗列参数,而是按企业桌面运维最常见的使用场景来重新整理:**身份权限、交互桌面、复制部署、执行控制、优先级、服务名、网络前提、安全基线和命令模板。**
我的判断是:PsExec 不是“会敲命令就能用好”的工具。真正稳定的用法,是先搞清楚远端执行链路,再根据场景选择最小必要参数。
2. 先建立全局视角:PsExec 选项不是一堆散乱参数
很多人学 PsExec 时,第一反应是打开帮助文档,把所有参数从上到下看一遍。这个方法效率不高。因为参数之间并不是平级关系,有些决定“用什么身份运行”,有些决定“在哪个会话运行”,有些决定“程序怎么复制过去”,还有一些决定“是否等待、是否回收输出、是否改服务名”。
这张图展示的是 PsExec 常用选项的整体分层:身份、交互、复制和控制是最核心的四条线。
从图中可以看出,PsExec 的参数不是孤立使用的。比如 `-u/-p` 解决的是“用谁的凭据连接远端”,`-h/-s/-l` 解决的是“远端进程用什么令牌运行”,`-c/-f/-v` 解决的是“程序是否要复制到远端”,`-d/-w/-n` 则决定执行流程和等待方式。
推荐先按场景记忆参数,而不是按字母表记忆参数。现场排障时,你真正需要问的是:我要用什么身份?是否需要交互?是否需要复制文件?是否需要等待结果?
可以用下面这个流程先判断参数组合:
3. 身份与权限:先决定用什么身份运行
PsExec 最容易被误用的参数,基本都集中在身份和权限这一组。因为远程执行不是简单地“我在本机是管理员,所以远端也一定是管理员”。它涉及登录凭据、远程访问令牌、UAC 完整性级别、SYSTEM 账户和用户配置文件。
这张图展示的是 PsExec 身份与权限类参数的关系。
从图中可以看出,`-u` 和 `-p` 只是解决“用哪个账号连接远端”的问题;`-h`、`-s`、`-l`、`-e` 才决定远端进程运行时的权限与环境。把这两层混在一起,就会出现“凭据正确但仍然 Access is denied”的误判。
3.1-u与-p:指定备用凭据
`-u` 用来指定远端登录用户名,支持域账号、UPN、本地账号等写法。
psexec \\PC-001 -u CONTOSO\opsadmin cmd /c whoami也可以使用 UPN:
psexec \\PC-001 -u opsadmin@contoso.com cmd /c whoami`-p` 用来指定密码,但生产环境不建议直接写明文。
psexec \\PC-001 -u CONTOSO\opsadmin -p S3cr3t! cmd /c whoami不建议在真实环境中使用明文 `-p`。密码可能进入命令历史、终端审计、进程命令行记录、脚本仓库和截图。
更推荐只写 `-u`,让系统交互提示输入密码;批量场景则结合 IPC 会话、cmdkey、LAPS、Vault 或堡垒机能力。
3.2-h:使用高完整性令牌,不是提权按钮
`-h` 的含义是在目标系统启用 UAC 时,尝试使用该管理员账号的高完整性令牌运行进程。
psexec \\PC-001 -u CONTOSO\opsadmin -h cmd /c whoami /groups这里要理解清楚:`-h` 不是把普通用户变成管理员。它只能在账号本身具备管理员权限时,使用更完整的管理员令牌。
3.3-s:以 Local System 身份运行
`-s` 会让远端进程以 Local System 身份运行。这在处理系统路径、服务、受保护文件、某些本地安全上下文问题时很有用。
psexec \\PC-001 -s cmd /c whoami返回结果通常会类似:
nt authority\systemSYSTEM 权限很高,但不是万能。它访问网络共享时通常没有你的域用户凭据,写 UNC 共享可能失败。
3.4-l:以受限用户运行
`-l` 会让进程以受限令牌运行,去掉管理员组权限,适合复现普通用户权限下的问题。
psexec \\PC-001 -l cmd /c whoami /groups在桌面支持场景中,这个参数适合排查“管理员能运行,普通用户不能运行”的软件兼容性或权限问题。
3.5-e:不加载用户配置文件
`-e` 表示不加载指定账户的用户配置文件。它可以加快启动速度,也能隔离一些用户环境变量、配置文件、注册表 HKCU 相关影响。
psexec \\PC-001 -u CONTOSO\opsadmin -e cmd /c set如果目标程序依赖用户配置文件、AppData、HKCU、证书、代理设置或用户环境变量,使用 `-e` 可能导致行为异常。
4. 交互与桌面会话:不要误以为远程执行一定能显示界面
很多桌面支持同事第一次用 PsExec 打开远端程序时,会遇到一个现象:命令执行了,但界面没看到。原因很简单,服务会话、用户桌面会话、锁屏安全桌面不是同一个东西。
4.1-i [session]:指定交互会话
`-i` 用来让远端进程在指定会话中交互运行。如果不指定 session,PsExec 会尝试选择合适会话,但现场并不总是符合预期。
psexec \\PC-001 -i 1 cmd如果你要在远端当前登录用户桌面上显示窗口,先确认会话 ID 更稳。
query session推荐先确认目标用户所在 session,再使用 `-i `,不要盲目写 `-i 1`。
4.2-x:Winlogon 安全桌面,谨慎使用
`-x` 用于在 Winlogon 安全桌面显示界面。这个参数使用场景很少,一般不适合常规桌面运维。
不要为了“让界面显示出来”就随便使用 `-x`。锁屏和登录界面的安全桌面有特殊边界,误用容易造成不可控现象。
5. 复制、执行与流程控制:决定程序怎么跑
PsExec 很适合临时推送工具到远端执行,但这里也容易踩坑。尤其是 `-c`、`-f`、`-v`、`-d`、`-w` 这几个参数,决定了程序是否复制、是否覆盖、是否等待、工作目录在哪里。
这张图展示的是复制和执行控制类参数。
从图中可以看出,复制阶段和执行阶段是两件事。`-c` 负责把本地程序复制到远端,`-f` 和 `-v` 决定覆盖策略,`-d` 决定是否等待远端进程结束,`-w` 决定远端工作目录,`-n` 决定连接超时。
5.1-c:复制本地程序到远端再执行
`-c` 会把本地程序复制到远端后执行,适合临时投放小工具、修复程序或一次性采集工具。
psexec \\PC-001 -c tool.exe如果需要传参,建议把工具名放在参数后面,后面跟程序自己的参数。
psexec \\PC-001 -c tool.exe arg1 arg2不要把 Linux 风格的 `--` 当成 PsExec 必需分隔符。PsExec 的命令结构不是所有场景都需要 `--`,照搬容易让读者误解。
5.2-f与-v:控制复制覆盖策略
`-f` 表示强制覆盖远端已有文件。
psexec \\PC-001 -c -f tool.exe`-v` 表示仅当本地文件版本更新或更高时才复制,适合部署版本化工具。
psexec \\PC-001 -c -v myagent.exe如果是频繁迭代的小工具,优先考虑 `-v`;如果是明确要替换旧版本,再使用 `-f`。
5.3-d:不等待远端进程结束
`-d` 表示启动后立即返回,不等待远端进程结束。它适合后台投放任务,但不适合需要返回码和实时输出的场景。
psexec \\PC-001 -d cmd /c "C:\Temp\job.exe >> C:\Temp\job.log 2>&1"只要你需要拿远端程序的真实退出码,就不要使用 `-d`。用了 `-d` 后,本地拿到的更多只是 PsExec 启动过程是否成功,而不是远端任务最终是否成功。
5.4-w:指定远端工作目录
很多程序依赖相对路径、配置文件或当前目录。此时应该用 `-w` 指定远端工作目录。
psexec \\PC-001 -w "C:\Temp" cmd /c "job.exe > run.log 2>&1"如果程序在远端执行时找不到配置、日志写错位置、相对路径失效,优先检查工作目录,而不是只怀疑程序本身。
5.5-n:设置连接超时
`-n <秒>` 用来指定连接超时时间。跨网段、慢链路、VPN、弱网络环境下可以适当调大。
psexec \\PC-001 -n 30 cmd /c hostname这不是让远端程序运行 30 秒,而是控制 PsExec 建立连接的等待时间。不要混淆。
6. 常用命令组合模板
参数理解以后,最有价值的是形成可复用模板。下面这些命令更接近企业桌面支持现场,而不是单纯演示语法。
6.1 单机远程打开高完整性 CMD
psexec \\PC-001 -u CONTOSO\opsadmin -h cmd这个命令适合远程执行管理员任务,但不一定会显示交互界面。如果需要显示到指定桌面会话,应加 `-i` 并确认会话 ID。
psexec \\PC-001 -u CONTOSO\opsadmin -h -i 1 cmd交互式远程 CMD 风险较高,不适合大规模常态化使用。能用非交互命令完成的,不要开远程交互 shell。
6.2 推送工具并后台执行
psexec \\PC-001 -c -f -d tool.exe arg1 arg2这个组合适合投放一次性工具后立即返回。由于使用了 `-d`,建议工具在远端自行写日志。
psexec \\PC-001 -c -f -d tool.exe /silent /log C:\Temp\tool.log6.3 SYSTEM 身份运行并写本地日志
使用 SYSTEM 身份时,一般不需要再叠加 `-h`。`-s` 已经表示使用 Local System 身份运行。
psexec \\PC-001 -s -w "C:\Temp" cmd /c "whoami & hostname & echo done > run.log"SYSTEM 身份适合处理本地系统资源,但访问网络共享不稳定。需要写共享路径时,优先使用具备共享权限的域账号。
6.4 IPC 会话建立、执行、清理
net use \\PC-001\IPC$ /user:CONTOSO\opsadmin * psexec \\PC-001 -nobanner -h cmd /c "hostname && whoami > C:\Temp\id.txt" net use \\PC-001\IPC$ /delete这个模板比在每条 PsExec 命令里写明文密码更稳,也便于执行后清理会话。
6.5 自定义远端服务名
默认情况下,PsExec 会使用 `PSEXESVC` 服务名。如果遇到安全策略误拦截、旧服务残留或多实例测试,可以通过 `-r` 指定服务名。
psexec \\PC-001 -r PXE_A -c -d jobA.exe psexec \\PC-001 -r PXE_B -c -d jobB.exe自定义服务名不是绕过安全审计的手段。企业环境中必须确保白名单、审批和日志留痕一致。
7. 常见报错:不要只盯着密码看
PsExec 报错时,很多人第一反应是“密码错了”。这个判断太粗。PsExec 的链路至少经过名称解析、SMB、Admin$、SCM/RPC、远端服务创建、安全软件和权限令牌。任意一环失败,都可能表现为执行失败。
这张图展示的是 PsExec 常见报错与修复路径。
从图中可以看出,Access denied、Admin$ 不可访问、PSEXESVC 安装失败、RPC/SCM 失败并不是同一类问题。正确做法是按链路排查,而不是盲目换账号、关防火墙或关闭安全软件。
7.1Access is denied.
高概率原因包括账号不是管理员、UAC 远程令牌过滤、Admin$ 不可访问、已有 SMB 会话使用了错误凭据。
net use \\PC-001\IPC$ /delete net use \\PC-001\ADMIN$ /delete dir \\PC-001\admin$推荐先清理旧 SMB 会话,再用正确凭据重新连接。不要在多重连接冲突状态下反复尝试 PsExec。
7.2Make sure that the default admin$ share is enabled...
这类报错通常说明 Admin$ 不可用,可能是 445 被拦、文件和打印共享关闭、Server 服务异常或管理共享被禁用。
sc \\PC-001 query LanmanServer dir \\PC-001\admin$不要为了跑通 PsExec 就直接关闭防火墙。应该按企业安全基线只对运维子网或跳板机放行必要端口。
7.3PSEXESVC could not be installed
这通常和写入权限、服务创建权限、EDR/杀软阻断、旧服务残留有关。
sc \\PC-001 query PSEXESVC sc \\PC-001 delete PSEXESVC如果安全软件拦截服务创建,需要按流程加入白名单,而不是临时关闭防护后忘记恢复。
7.4 UI 不显示
UI 不显示通常不是命令没执行,而是执行到了非交互会话,或者目标用户会话 ID 不正确。
query session psexec \\PC-001 -i 1 notepad.exe交互界面问题要从 session 角度看,不要只看进程是否启动。
8. 安全基线与速查表:把 PsExec 用成可审计工具
PsExec 的能力很强,所以它不应该被当成“个人临时小工具”随便使用。企业环境中,PsExec 至少应该纳入凭据管理、网络边界、权限最小化、日志审计和任务清理。
这张图展示的是 PsExec 的安全基线与常用选项速查。
从图中能看出,安全使用 PsExec 的重点不是“隐藏执行痕迹”,而是让每一次远程执行都有授权、有账号边界、有命令记录、有输出日志、有清理动作。
8.1 不要写明文密码
真实环境里,尽量避免这种写法:
psexec \\PC-001 -u CONTOSO\opsadmin -p S3cr3t! cmd /c whoami明文密码是 PsExec 使用中的高风险动作。它解决的是一时方便,制造的是长期泄露面。
推荐方式是:
psexec \\PC-001 -u CONTOSO\opsadmin cmd /c whoami或者使用 IPC 会话:
net use \\PC-001\IPC$ /user:CONTOSO\opsadmin * psexec \\PC-001 cmd /c whoami net use \\PC-001\IPC$ /delete8.2 保留审计线索
建议关注以下日志:
安全日志 4624:网络登录 安全日志 4672:特殊权限分配 安全日志 4688:进程创建 系统日志 7045:服务创建 Sysmon 事件:进程、网络、文件创建成熟做法是把 PsExec 执行记录写入工单,包括目标主机、执行账号、执行命令、开始时间、结束时间、返回码和输出日志位置。
8.3 清理远端服务和会话
任务结束后,至少要清理 SMB 会话和凭据缓存。
net use \\PC-001\IPC$ /delete cmdkey /delete:PC-001必要时检查 PSEXESVC 是否残留:
sc \\PC-001 query PSEXESVC清理不是为了抹掉审计,而是为了避免旧会话、旧服务、旧凭据影响下一次远程操作。
8.4 PsExec 参数速查
身份/令牌: -u/-p -h -s -l -e 交互桌面: -i [session] -x 复制部署: -c <file> -f -v 运行控制: -d -w <dir> -a <cpu> -n <sec> 优先级类: -low -belownormal -abovenormal -high -realtime 服务与杂项: -r <svcname> -nobanner -accepteula`-realtime` 极危险,除非非常明确知道后果,否则不要在生产终端使用。实时优先级可能影响系统响应,甚至让机器看起来像假死。
9. 我的实战建议
在企业桌面支持场景里,PsExec 最稳的使用方式不是“参数越多越强”,而是“参数越少越清楚”。每增加一个参数,都要知道它改变了哪一层行为:身份、令牌、会话、复制、等待、输出、服务名还是网络连接。
我一般会按下面的顺序判断:
第一,能不用交互就不用交互。优先远端非交互命令执行,避免开远程 shell。
第二,能不用 SYSTEM 就不用 SYSTEM。只有处理系统级对象时才考虑 `-s`。
第三,能不复制就不复制。远端已有工具时直接调用;需要临时投放时再用 `-c`。
第四,凡是要判断成功失败,就不要用 `-d`。需要后台异步执行时,必须让远端自己写日志。
第五,所有批量操作都要先单机试点。不要第一条命令就对一百台机器执行。
下面是一套更稳的批量执行骨架,适合后续改造成企业内部 SOP。
@echo off setlocal enabledelayedexpansion set "HOSTLIST=C:\hosts.txt" set "LOGROOT=D:\PsExecLogs" if not exist "%LOGROOT%" md "%LOGROOT%" for /f %%H in (%HOSTLIST%) do ( echo [%%H] 开始执行... psexec \\%%H -nobanner -accepteula -h cmd /c "hostname && whoami" > "%LOGROOT%\%%H.log" 2>&1 set "RC=!ERRORLEVEL!" echo %%H,!RC!>> "%LOGROOT%\summary.csv" echo [%%H] ExitCode=!RC! ) echo 完成,请查看 %LOGROOT% endlocal这个模板的价值不在于命令复杂,而在于它保留了主机维度日志和返回码。后续做工单复盘时,能说清楚哪台成功、哪台失败、失败日志在哪里。
10. 小结
PsExec 的命令行选项看起来很多,但真正核心的分类并不复杂:身份权限、交互会话、复制部署、执行控制、安全审计。只要把这几层分清楚,参数组合就不会乱。
这篇文章最值得记住的不是某一个参数,而是下面几个判断:
需要管理员完整令牌时使用 `-h`,但它不是提权按钮。
需要 SYSTEM 身份时使用 `-s`,但不要误以为 SYSTEM 能访问所有网络资源。
需要复制本地程序时使用 `-c`,需要覆盖时配合 `-f`,需要版本判断时配合 `-v`。
需要等待远端结果时不要使用 `-d`;使用 `-d` 时必须让远端自己写日志。
不要在命令行写明文密码,不要随意关闭 UAC、防火墙或 EDR,不要把 PsExec 当成绕过安全策略的工具。
从企业运维角度看,PsExec 最成熟的用法,是把它纳入标准化流程:执行前确认权限和网络,执行中记录输出和返回码,执行后清理会话与凭据,最后把结果写进工单。这样用,PsExec 才不是“临时黑科技”,而是可以复盘、可以交接、可以审计的远程运维工具。
返回顶部
