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

发布时间:2026/5/21 23:14:18

《Windows Sysinternals实战指南》Tools 学习笔记(7.6):PsExec 命令行选项全图鉴(含最佳实践与模板) 个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化PsTools 学习笔记7.6PsExec 命令行选项全图鉴含最佳实践与模板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 -xWinlogon 安全桌面谨慎使用5. 复制、执行与流程控制决定程序怎么跑5.1 -c复制本地程序到远端再执行5.2 -f 与 -v控制复制覆盖策略5.3 -d不等待远端进程结束5.4 -w指定远端工作目录5.5 -n设置连接超时6. 常用命令组合模板6.1 单机远程打开高完整性 CMD6.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 installed7.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也可以使用 UPNpsexec \\PC-001 -u opsadmincontoso.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 用来让远端进程在指定会话中交互运行。如果不指定 sessionPsExec 会尝试选择合适会话但现场并不总是符合预期。psexec \\PC-001 -i 1 cmd如果你要在远端当前登录用户桌面上显示窗口先确认会话 ID 更稳。query session推荐先确认目标用户所在 session再使用 -i 不要盲目写 -i 1。4.2-xWinlogon 安全桌面谨慎使用-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 21只要你需要拿远端程序的真实退出码就不要使用 -d。用了 -d 后本地拿到的更多只是 PsExec 启动过程是否成功而不是远端任务最终是否成功。5.4-w指定远端工作目录很多程序依赖相对路径、配置文件或当前目录。此时应该用 -w 指定远端工作目录。psexec \\PC-001 -w C:\Temp cmd /c job.exe run.log 21如果程序在远端执行时找不到配置、日志写错位置、相对路径失效优先检查工作目录而不是只怀疑程序本身。5.5-n设置连接超时-n 秒 用来指定连接超时时间。跨网段、慢链路、VPN、弱网络环境下可以适当调大。psexec \\PC-001 -n 30 cmd /c hostname这不是让远端程序运行 30 秒而是控制 PsExec 建立连接的等待时间。不要混淆。6. 常用命令组合模板参数理解以后最有价值的是形成可复用模板。下面这些命令更接近企业桌面支持现场而不是单纯演示语法。6.1 单机远程打开高完整性 CMDpsexec \\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.logSYSTEM 身份适合处理本地系统资源但访问网络共享不稳定。需要写共享路径时优先使用具备共享权限的域账号。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 HOSTLISTC:\hosts.txt set LOGROOTD:\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 21 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 才不是“临时黑科技”而是可以复盘、可以交接、可以审计的远程运维工具。返回顶部

相关新闻