个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化PsTools 学习笔记7.2通用功能与远程操作基础1. 这篇文章解决什么问题2. PsTools 通用命令约定2.1 帮助参数不要写错2.2 首次运行建议静默接受 EULA2.3 去掉横幅方便日志分析3. 远程目标写法与凭据安全3.1 单机目标3.2 多机目标3.3 显式凭据3.4 域环境与工作组环境的差异4. 输出、返回码与日志收口4.1 标准输出与错误输出4.2 返回码判断4.3 批量日志模板5. 批量执行的正确套路采集、变更、验证5.1 第一步采集系统信息5.2 第二步执行变更动作5.3 第三步验证结果6. 常见连接问题与最佳实践6.1 Access is denied6.2 The RPC server is unavailable6.3 The network path was not found6.4 长时间卡住6.5 安全软件或 EDR 拦截7. 即抄即用远程体检一条龙8. 企业环境中的使用边界8.1 最小权限8.2 先单机后批量8.3 记录命令与结果8.4 明确维护窗口9. 小结1. 这篇文章解决什么问题上一篇 7.1 我们已经把 PsTools 工具家族做了一次总览知道了 PsExec、PsInfo、PsService、PsLoggedOn、PsFile、PsShutdown 等工具分别能做什么。到了 7.2就不能只停留在“认识工具”的层面了要开始解决一个更实际的问题这些工具到底怎么远程连接、怎么指定目标、怎么传凭据、怎么批量执行、怎么记录结果、怎么判断成功失败。很多人第一次用 PsTools会直接从 PsExec 开始敲命令。这个思路没错但容易踩坑。因为 PsTools 家族里很多工具共享相似的远程目标写法、凭据处理方式、EULA 处理方式、输出习惯和错误表现。如果这些共性没吃透后面学每个子工具都会反复卡在同一类问题上。我的判断是7.2 这一篇不是“参数大全”而是 PsTools 的远程操作地基。地基打稳了后面讲 PsExec、PsService、PsInfo、PsLogList 才会顺。这张图展示的是 PsTools 通用功能总览包括远程目标、凭据安全、批量执行、日志输出和返回码等共性能力。从图中可以看出PsTools 的核心不只是“远程执行一条命令”而是把远程 Windows 主机变成可脚本化、可批量处理、可验证结果的对象。对企业桌面支持来说这一点比单条命令本身更重要。2. PsTools 通用命令约定PsTools 家族里的工具虽然功能不同但有一些通用习惯。先把这些共性掌握住后续看每个子工具时就不会混乱。2.1 帮助参数不要写错PsTools 里很多工具使用 /? 查看帮助而不是统一使用 -h。这一点很容易被忽略因为很多命令行工具习惯用 -h 或 --help。psexec /? psinfo /? psservice /?注意在 PsTools 家族中-h 不一定是帮助参数。例如 PsExec 中的 -h 通常表示使用提升令牌运行而不是查看帮助。2.2 首次运行建议静默接受 EULASysinternals 工具首次运行时通常会弹出许可协议。如果是手工执行点确认即可如果是脚本、计划任务或批量执行弹窗会直接阻断流程。psexec -accepteula psinfo -accepteula psservice -accepteula推荐做法在标准化工具部署脚本里统一执行一次 -accepteula避免真正排障时被协议弹窗卡住。2.3 去掉横幅方便日志分析很多 PsTools 命令会输出版权横幅。手工看问题不大但写日志、做比对、批量处理时横幅会干扰结果解析。psexec \\PC-001 -nobanner whoami psinfo \\PC-001 -nobanner -d -h-nobanner 的价值在于让输出更干净尤其适合重定向到日志文件或者后续用脚本提取关键字段。3. 远程目标写法与凭据安全PsTools 远程操作的目标写法比较统一一般使用 \\计算机名 或 \\IP地址。如果是多台主机可以使用逗号分隔也可以使用主机清单文件。这张图展示的是远程目标写法与凭据安全之间的关系包括 \\主机名、\\IP、FQDN、-u/-p、SMB 445、RPC 135 和最小权限原则。从图中可以看出远程执行不是单纯输入一个主机名。它背后涉及名称解析、网络端口、认证方式、权限级别和安全软件策略。很多连接失败本质上不是命令写错而是这些前置条件有一个没满足。3.1 单机目标单机目标最常见写法如下psexec \\PC-001 whoami psexec \\10.10.10.10 whoami如果主机名解析不稳定可以先用 IP 测试如果 IP 能通、主机名不通重点排查 DNS 或本地域名解析。3.2 多机目标部分工具支持多主机写法常见方式有两种psexec \\PC01,PC02,PC03 ipconfig /all或者使用主机清单文件psexec \\C:\hosts.txt -accepteula -nobanner ipconfig /allhosts.txt 建议一行一个主机名便于维护和审计。3.3 显式凭据如果当前登录用户没有目标机器权限可以通过 -u 指定账号通过 -p 指定密码。psexec \\PC-001 -u CORP\ops -p ******** whoami /groups不要在公开文章、共享脚本或截图中暴露真实密码。企业环境应尽量使用受控服务账户、凭据管理方案或交互式安全输入。如果只写 -u 不写 -p部分场景会提示输入密码这比把密码直接写进命令行更安全。3.4 域环境与工作组环境的差异域环境中优先使用域账户和 FQDN注意时间同步避免 Kerberos 认证问题。工作组环境中本地管理员远程连接经常会遇到 UAC 远程限制表现为明明账号是管理员但远程执行仍然权限不足。域环境更适合做标准化批量运维工作组环境更容易出现凭据、UAC、共享和防火墙问题需要额外验证。4. 输出、返回码与日志收口手工执行一条 PsTools 命令时看屏幕输出就够了。但一旦进入批量执行就必须关注三个问题标准输出在哪里错误输出在哪里远端进程返回码是什么。这张图展示的是 PsTools 输出与返回码的处理方式包括标准输出、错误输出、ERRORLEVEL 和按主机生成日志文件。从图中可以看出批量运维不能只盯控制台窗口。正确做法是把每台主机的输出和错误分别沉淀到日志里再通过返回码判断执行结果。否则执行了 100 台机器最后你只知道“好像跑过了”说不清哪台成功、哪台失败。4.1 标准输出与错误输出最基本的日志写法如下psexec \\PC-001 -accepteula -nobanner ipconfig /all D:\logs\PC-001.txt 21这里的 表示重定向标准输出21 表示把错误输出也合并写入同一个文件。这样无论命令成功还是失败都能在日志中留下痕迹。4.2 返回码判断在不使用特殊异步参数的情况下可以通过 %ERRORLEVEL% 判断命令退出码。psexec \\PC-001 -nobanner whoami echo ExitCode%ERRORLEVEL%如果返回码为 0通常代表命令执行成功非 0 则需要结合输出内容判断具体失败原因。如果使用了类似 PsExec 的 -d 不等待选项返回码含义会发生变化。此时不要直接把 %ERRORLEVEL% 当作远端程序真实执行结果。4.3 批量日志模板下面这个批处理模板适合将每台主机的执行结果单独落盘echo off setlocal enabledelayedexpansion set LOGD:\psexec-logs if not exist %LOG% md %LOG% for /f %%h in (C:\hosts.txt) do ( echo %%h psexec \\%%h -accepteula -nobanner ipconfig /all %LOG%\%%h.txt 21 echo ExitCode!ERRORLEVEL! %LOG%\%%h.txt ) endlocal这里启用了 enabledelayedexpansion是为了在循环中正确记录每台主机的返回码。如果不用延迟变量批处理里很容易拿到错误的返回值。推荐批量执行时按“主机名 时间戳”生成日志后续复盘和追责都更清楚。5. 批量执行的正确套路采集、变更、验证很多批量脚本的问题不是命令不能执行而是缺少闭环。成熟的远程运维不应该是“直接改”而应该是先采集当前状态再执行变更最后验证结果。满足不满足读取主机清单采集当前状态是否满足执行条件执行变更动作记录跳过原因回验结果输出主机日志这个流程看起来比直接执行多几步但它能解决一个关键问题出了问题以后你知道变更前是什么状态变更后是什么结果。5.1 第一步采集系统信息先采集系统信息和磁盘信息适合做批量检查前的基线记录。for /f %%h in (C:\hosts.txt) do ( psinfo \\%%h -accepteula -nobanner -d -h D:\audit\%%h-sysinfo.txt )这里 -d 用于输出磁盘信息-h 在 PsInfo 中表示包含 Hotfix 信息不是帮助参数。5.2 第二步执行变更动作以下示例以重启打印服务 Spooler 为例for /f %%h in (C:\hosts.txt) do ( psservice \\%%h -accepteula -nobanner stop Spooler psservice \\%%h -accepteula -nobanner start Spooler )批量停止或启动服务前必须确认业务影响。打印服务还算相对低风险如果是业务服务、加密服务、安全服务就不能直接照搬。5.3 第三步验证结果变更完成后要把服务状态和相关进程一起查一遍。for /f %%h in (C:\hosts.txt) do ( psservice \\%%h -nobanner query Spooler D:\audit\%%h-spooler.txt pslist \\%%h -nobanner spoolsv D:\audit\%%h-spooler.txt )如果服务显示为 RUNNING并且 spoolsv 进程存在说明打印服务已恢复到运行状态。这个验证动作很关键因为“命令执行过”和“服务真的恢复”不是一回事。6. 常见连接问题与最佳实践PsTools 现场最常见的问题集中在连接、权限、端口和安全软件上。你要先分层判断不要看到报错就只换密码也不要一遇到 RPC 问题就重启机器。这张图展示的是 PsTools 常见连接问题与最佳实践包括拒绝访问、RPC 不可用、网络路径找不到、EDR 拦截以及先单机后批量、探测执行回验等原则。从图中可以看出连接问题要按层排查先看目标是否在线再看名称解析再看 SMB/RPC 端口再看 Admin$再看管理员权限最后看 UAC 和 EDR。顺序乱了就会来回折腾。6.1 Access is denied常见原因包括账号不是目标机管理员、UAC 远程限制、Admin$ 被禁用、安全策略拦截。net use \\PC-001\ADMIN$ /user:CORP\ops dir \\PC-001\ADMIN$推荐先验证 ADMIN$ 是否可访问再判断 PsTools 命令本身是否有问题。6.2 The RPC server is unavailable这个错误通常和 RPC 服务、135 端口、防火墙、动态 RPC 端口范围有关。先检查目标机在线状态再确认防火墙策略。ping PC-001 sc \\PC-001 query RpcSs6.3 The network path was not found这个错误更偏名称解析、SMB 访问和网络路径问题。可以先用 IP 地址代替主机名测试。ping PC-001 ping 10.10.10.10 net view \\PC-0016.4 长时间卡住长时间卡住可能是防火墙拦截、目标机安全软件拦截、远程服务创建失败或者命令本身在远端等待输入。批量执行时不要让命令无限等待。应设置超时、分批执行并把失败主机单独记录出来。6.5 安全软件或 EDR 拦截PsExec 这类远程执行工具可能会触发安全软件规则。企业环境中不要私自绕过拦截而应通过工具签名、使用范围、执行账户、目标主机和日志留存进行审批。安全软件拦截 PsTools 不一定是误报。远程执行、服务创建、批量命令本身就是高风险行为必须纳入管理边界。7. 即抄即用远程体检一条龙下面这组命令适合单机远程体检目标是快速确认通路、身份、基础资产、登录用户、共享文件和服务健康状态。它不是最终修复脚本而是排障前的基础检查模板。:: 1. 通断与身份 psexec \\PC-001 -nobanner whoami echo OK || echo FAIL :: 2. 创建审计目录 if not exist D:\audit\PC-001 md D:\audit\PC-001 :: 3. 基本资产与补丁信息 psinfo \\PC-001 -nobanner -d -h D:\audit\PC-001\sysinfo.txt :: 4. 当前登录用户与打开的共享文件 psloggedon \\PC-001 D:\audit\PC-001\logon.txt psfile \\PC-001 D:\audit\PC-001\shares.txt :: 5. 服务健康检查 psservice \\PC-001 query WinRM D:\audit\PC-001\winrm.txt执行完成后建议重点查看四类结果whoami 是否成功、sysinfo.txt 是否有完整系统信息、logon.txt 是否显示当前用户、winrm.txt 中服务状态是否正常。如果这组体检命令能跑通说明目标主机的远程管理基础条件基本可用。后续再执行修复动作会稳很多。8. 企业环境中的使用边界PsTools 的特点是轻量、直接、强大。但在企业环境里强大本身就是风险。远程执行、远程杀进程、远程改服务、远程重启都必须有边界。8.1 最小权限能只读就不要写能查询就不要修改能单机验证就不要直接批量。不要为了省事长期使用域管理员账号跑日常脚本。8.2 先单机后批量任何批量命令都应该先在一台测试机器上跑通再扩大范围。特别是涉及服务、进程、重启的命令不能直接对整个网段执行。8.3 记录命令与结果建议所有批量命令都记录目标主机、执行时间、执行人、命令内容和结果日志。否则出了问题很难复盘。8.4 明确维护窗口重启、停止服务、修改配置这类操作要放在维护窗口内执行。如果当前有用户登录应先沟通或至少确认影响范围。不要把 PsTools 当成绕过流程的工具。它应该帮助你标准化运维而不是跳过审批和审计。9. 小结PsTools 7.2 的重点不是某个具体子工具而是所有远程操作都绕不开的通用基础命令约定、远程目标、凭据安全、输出日志、返回码、批量执行和连接排错。如果你只记命令很快会在现场被权限、网络、UAC、EDR、日志缺失这些问题卡住。更稳的方式是建立一套固定流程先确认目标写法再确认凭据权限再验证 SMB/RPC 通路再执行命令最后把输出和返回码写入日志。从桌面运维角度看PsTools 真正的价值不是“远程执行”而是把远程主机操作变成可验证、可追踪、可批量复用的标准动作。建议后续学习 PsExec 时不要只关注“怎么远程开 cmd”而要重点理解它的服务创建、凭据传递、会话、权限提升和安全软件拦截边界。最后提醒远程操作一定要有授权边界。尤其是批量执行、杀进程、改服务、重启机器不要在没有维护窗口和回滚计划的情况下直接操作。返回顶部