当前位置: 首页 > news >正文

《Windows Sysinternals实战指南》Tools 学习笔记(7.6):PsExec 命令行选项全图鉴(含最佳实践与模板)


🔥个人主页:杨利杰YJlio
❄️个人专栏:《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》
《微信助手》 《锤子助手》 《Python》 《Kali Linux》
《那些年未解决的Windows疑难杂症》
🌟让复杂的事情更简单,让重复的工作自动化


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` 则决定执行流程和等待方式。

推荐先按场景记忆参数,而不是按字母表记忆参数。现场排障时,你真正需要问的是:我要用什么身份?是否需要交互?是否需要复制文件?是否需要等待结果?

可以用下面这个流程先判断参数组合:

需要

不需要

需要

需要 SYSTEM

低权限复现

需要

不需要

需要

不需要

等待

不等待

准备使用 PsExec

是否需要备用凭据

-u 指定用户
避免明文 -p

使用当前登录凭据

是否需要管理员完整令牌

-h 高完整性

-s 以 Local System 运行

-l 受限用户

是否需要桌面交互

-i 指定会话

后台命令执行

是否需要复制程序

-c -f -v

直接执行远端已有程序

是否等待结果

不使用 -d
获取退出码

-d 异步执行
远端自行写日志


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\system

SYSTEM 权限很高,但不是万能。它访问网络共享时通常没有你的域用户凭据,写 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.log

6.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$ /delete

8.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 才不是“临时黑科技”,而是可以复盘、可以交接、可以审计的远程运维工具。


返回顶部

```
http://www.jsqmd.com/news/860804/

相关文章:

  • CANN算子生成器Agent配置
  • 10个Elog实用技巧:让你的博客管理效率翻倍
  • 【大模型12步学习路线 · 第12步 · ③IC验证实战篇】Veri-Copilot v1.0 大结局:多模态 RAG 让 LLM “看懂“ Spec 时序图
  • 真实有效!AI率92%暴降至5%!实测10款降AIGC网站!免费额度狂薅攻略
  • 多图像查看器:告别繁琐切换,高效管理海量图片的专业解决方案
  • [html-2]官网已经写好,官网模板!精品网页,全文字特效,有短链接、内联框、代跳转三大功能,代码简洁简单干净,可以参考学习,静态官网完整示例,打磨了很久的官网代码,附完整全部源码。
  • Phoronix Test Suite:如何构建企业级自动化性能测试平台?
  • CANN/ops-tensor Kernel API 概述
  • 24V直流电源的大地与正极连接导致的问题
  • Nginx 重启失败报错 SSL 证书文件权限拒绝怎么办
  • 2026年腾讯云OpenClaw/Hermes Agent配置Token Plan新手必看指南
  • 外墙彩涂卷哪家好?2026外墙彩涂卷选购指南 - 资讯纵览
  • Tunasync架构深度解析:Manager-Worker设计模式详解
  • 4种信息泄漏检测场景,dumpall如何帮你高效应对?
  • 如何5分钟掌握ZeroOmega:浏览器代理智能切换的终极指南
  • AnyFlip下载器:一键将在线翻页书转换为PDF的终极解决方案
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan新手必看指南
  • Pandora.js监控数据可视化:集成Grafana打造企业级监控面板
  • 博德之门3脚本扩展器终极指南:5分钟掌握游戏定制化
  • CANN/ops-tensor矩阵乘Kernel框架
  • bezier-easing测试与基准测试:确保性能与精度的最佳实践
  • 对比直接使用原厂 API 体验 Taotoken 在多模型聚合与路由上的优势
  • 10分钟快速上手ModSecurity-nginx:从零构建企业级Web应用防火墙
  • 2026初学者电钢琴保姆级避坑指南|新手全阶段适配攻略,资深钢琴老师力荐
  • 为什么你的ElevenLabs新疆语输出总带口音?92%开发者忽略的3个IPA音系校准参数(附维吾尔语元音舌位图)
  • 大模型的商业化应用:从ToB到ToC的全场景覆盖
  • AI创业的现状与未来:大模型时代下的创业机会
  • 新手如何选购第一台电钢琴?真实经验分享,这8款闭眼入不踩坑
  • 题解:洛谷 P2845 [USACO15DEC] Switching on the Lights S
  • CANN/Ascend C:批处理矩阵乘法临时缓冲区大小计算