《Windows Sysinternals实战指南》PsTools 学习笔记(7.5):PsExec 的备用凭据与安全基线 个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化PsTools 学习笔记7.5PsExec 的备用凭据与安全基线1. 这篇文章解决什么问题2. PsExec 凭据的三种写法2.1 直接指定 -u 和 -p2.2 只指定用户名交互输入密码2.3 预先建立 IPC 会话2.4 使用 Windows 凭据管理器3. 域账号、本地账号和跨域场景3.1 域账号企业环境优先选择3.2 本地账号工作组场景常见但坑更多3.3 跨域和无信任关系4. PsExec 背后到底做了什么4.1 SMB 和 Admin$4.2 SCM 和 RPC4.3 PSEXESVC 服务残留5. 权限与 UAC最容易踩的坑5.1 先排除 Admin$ 和 SMB 会话5.2 UAC 远程限制5.3 -h 不是权限放大器6. 企业安全基线建议6.1 杜绝命令行明文密码6.2 最小权限和专用账户6.3 审计与留痕6.4 网络白名单6.5 清理会话和凭据7. 实战模板IPC 会话 执行 清理8. 典型错误与修复清单9. 最小安全使用流程10. 小结1. 这篇文章解决什么问题PsExec 很强但它也很敏感。它能远程执行命令、复制组件、创建远程服务、回传控制台输出所以在企业环境里它既是桌面运维的利器也很容易被安全软件、EDR 或审计策略重点关注。实际现场里很多人第一次用 PsExec 的备用凭据时会直接写成 -u 用户名 -p 密码。这确实最直观但也是最不应该长期使用的方式。因为密码可能留在命令历史、脚本文件、终端记录、进程命令行快照、堡垒机录像或日志平台中。这篇文章重点解决三个问题PsExec 凭据应该怎么安全传递、为什么凭据正确也可能 Access is denied、企业环境里怎样建立一套可审计的安全基线。我的判断是PsExec 的难点不在“能不能跑通一条命令”而在“能不能在不裸奔密码、不越权、不破坏审计边界的情况下稳定跑通”。2. PsExec 凭据的三种写法PsExec 使用备用凭据时常见写法大致有三类直接在命令行写明文密码、只指定用户名并交互输入密码、提前建立认证会话后再执行 PsExec。三种方式都能用但安全边界完全不同。2.1 直接指定-u和-p这是最直观的写法也是最容易被新手照搬的写法。psexec \\PC-001 -u CONTOSO\opsadmin -p S3cr3t! cmd /c whoami这条命令可以让 PsExec 使用 CONTOSO\opsadmin 连接目标机器并在远端执行 whoami。生产环境不建议这样写。密码直接出现在命令行里可能被 Shell 历史、脚本仓库、终端审计、进程监控、截图或日志系统记录下来。这类写法只适合临时测试、隔离实验环境且命令中不应该出现真实生产密码。真正在企业环境使用应优先选择交互输入、凭据管理器、IPC 会话或密管系统。2.2 只指定用户名交互输入密码更稳妥的方式是只写 -u不写 -p。执行时由 PsExec 提示输入密码输入内容不会在控制台明文显示。psexec \\PC-001 -u CONTOSO\opsadmin cmd /c whoami执行后会提示输入密码Password:推荐用于单机排障、临时远程操作、半自动执行场景。它比把密码写到命令行里安全得多。缺点也很明显它不适合完全无人值守批量执行。如果需要批量处理应该结合受控凭据来源而不是把密码写死到脚本里。2.3 预先建立 IPC 会话批量脚本中可以先用 net use 建立到目标主机的 IPC 会话然后再执行 PsExec。这样 PsExec 可以复用已经建立的认证上下文。net use \\PC-001\IPC$ /user:CONTOSO\opsadmin S3cr3t! /persistent:no psexec \\PC-001 cmd /c whoami net use \\PC-001\IPC$ /delete这个方法比每条 PsExec 命令都写 -u/-p 更容易做批量控制也更方便在任务结束后清理会话。但它仍然没有解决“密码如何安全进入脚本”的根问题。如果密码写在脚本中风险依然存在。2.4 使用 Windows 凭据管理器另一种方式是使用 cmdkey 将凭据写入当前用户的 Windows 凭据管理器。后续访问目标主机时可以复用该凭据。cmdkey /add:PC-001 /user:CONTOSO\opsadmin /pass:S3cr3t! psexec \\PC-001 cmd /c whoami cmdkey /delete:PC-001这种方式比命令行中反复带 -p 更干净但它并不是“绝对安全”。凭据被写入当前用户的凭据存储中执行完成后应及时清理。企业更推荐结合 LAPS、Windows LAPS、Vault、PAM、堡垒机或 JIT 权限模型避免长期共享固定高权限密码。3. 域账号、本地账号和跨域场景凭据写法只是表面真正影响成功率的是账号类型。域账号、本地账号、UPN、跨域账号在认证、权限、UAC 和审计上的表现都不一样。3.1 域账号企业环境优先选择域环境中建议使用受控的运维域账号。psexec \\PC-001 -u CONTOSO\opsadmin cmd /c whoami也可以使用 UPN 格式psexec \\PC-001 -u opsadmincontoso.com cmd /c whoami推荐域账号的原因很直接权限可以集中管理、审计路径清晰、密码策略和登录范围可以通过域控与安全策略统一约束。3.2 本地账号工作组场景常见但坑更多本地账号可以写成psexec \\PC-001 -u PC-001\Administrator cmd /c whoami也可以写成本机上下文相对形式psexec \\PC-001 -u .\Administrator cmd /c whoami但工作组环境下本地管理员远程访问很容易遇到 UAC 远程限制。也就是说账号本身可能是管理员但远程拿到的令牌不是完整管理员令牌。不要简单认为“本地 Administrator 密码正确 远程一定有完整管理员权限”。工作组环境里这句话经常不成立。3.3 跨域和无信任关系跨域场景要看域之间是否存在信任关系。如果没有信任关系Kerberos/NTLM 认证就会受到限制。此时常见选择是使用目标机本地管理员、跳板机、堡垒机或受控运维平台。跨域问题不要只从 PsExec 参数层面解决。它本质上是身份边界、信任关系和网络访问策略的问题。4. PsExec 背后到底做了什么很多人说“凭据明明对为什么还报错”。这个问题不能只看用户名密码。PsExec 要完成远程执行至少要经过 SMB、Admin$、SCM/RPC、远程服务、命名管道几个环节。可以把 PsExec 的远程执行流程理解为下面这条链路本机执行 PsExec使用凭据连接目标 ADMIN$复制 PSEXESVC 到远端通过 SCM/RPC 创建远程服务启动 PSEXESVC远端执行目标命令命名管道回传 STDIN/STDOUT/STDERR本机显示输出并获取退出码这也是为什么凭据正确仍可能失败只要 Admin$ 不通、RPC 被拦、服务创建失败、EDR 阻断、权限令牌不足最终都会表现为 PsExec 执行异常。4.1 SMB 和 Admin$PsExec 通常需要访问目标机器的 ADMIN$ 管理共享。先验证这一点比直接跑 PsExec 更稳。dir \\PC-001\admin$如果这里都访问失败说明问题还在共享、凭据、权限、防火墙或 Admin$ 配置层面。4.2 SCM 和 RPCPsExec 需要通过远程服务控制管理器创建并启动服务。可以用 sc 做基础验证。sc \\PC-001 query type service如果返回 RPC 不可用重点检查防火墙、RPC 服务、动态 RPC 端口和网络策略。4.3 PSEXESVC 服务残留异常中断后目标机可能遗留 PSEXESVC 服务或文件。可以检查sc \\PC-001 query PSEXESVC dir \\PC-001\ADMIN$\System32\PSEXESVC.exe确认没有任务正在运行后可以清理旧服务sc \\PC-001 delete PSEXESVC不要在不确认现场状态的情况下随意删除远端服务。尤其是多人同时排障时可能会中断别人的远程任务。5. 权限与 UAC最容易踩的坑Access is denied. 是 PsExec 使用中最常见的报错之一但它不是一个单一原因。它可能是账号不是管理员也可能是 Admin$ 不通也可能是 UAC 远程限制也可能是已有 SMB 会话占用错误凭据。5.1 先排除 Admin$ 和 SMB 会话先确认 Admin$ 是否可访问。dir \\PC-001\admin$如果之前用其他凭据访问过同一主机可能会存在多重连接问题。可以先清理会话。net use \\PC-001\IPC$ /delete net use \\PC-001\ADMIN$ /delete然后重新建立正确会话。net use \\PC-001\IPC$ /user:CONTOSO\opsadmin * /persistent:no推荐使用 * 让系统交互提示输入密码避免把密码写进命令行。5.2 UAC 远程限制工作组或本地管理员场景中Windows 可能会对远程本地管理员应用令牌过滤。结果就是账号属于 Administrators但远程操作拿到的是受限令牌。在经过合规评估后可在目标机设置reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System ^ /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f这个注册表项会改变本地管理员远程访问行为不建议作为常规批量基线直接下发。更推荐使用域侧权限模型、LAPS 或受控运维账号。5.3-h不是权限放大器PsExec 的 -h 用于在远端使用高完整性令牌运行但前提是当前凭据本身具备管理员权限。它不是“普通用户变管理员”的参数。psexec \\PC-001 -u CONTOSO\opsadmin -h cmd /c whoami /groups可以把 -h 理解成“使用已有管理员身份的完整令牌”而不是“凭空提升权限”。6. 企业安全基线建议PsExec 不应该只是个人手里的临时工具。只要进入企业环境就必须考虑账号、密码、日志、网络、EDR、清理和审计。否则今天解决了一个远程问题明天可能制造一个安全问题。6.1 杜绝命令行明文密码不要把真实密码写进 -p、批处理、PowerShell 脚本、工单备注、知识库文章或截图里。推荐顺序交互输入密码 → IPC/cmdkey 短期凭据 → LAPS/Windows LAPS/Vault/PAM/JIT 权限。6.2 最小权限和专用账户建议为远程运维准备专用域账号不要长期使用个人域管账号。账号应限制登录范围、使用时间、目标 OU 和操作权限。最危险的做法是一个共享高权限账号 固定密码 写在脚本里 批量到所有终端。6.3 审计与留痕建议打开进程创建日志、Sysmon 或 EDR 审计记录谁在什么时候对哪台机器执行了什么命令。可以重点关注Windows 安全日志4688 进程创建 Windows 安全日志4624 网络登录 Windows 安全日志4672 特殊权限分配 系统日志Service Control Manager 7045 服务创建 Sysmon进程创建、网络连接、文件创建PsExec 的可控使用不是“隐藏痕迹”而是“让每一次远程执行都说得清楚”。6.4 网络白名单建议仅对运维子网或跳板机放行必要端口不要对全网无差别放开 SMB/RPC。SMBTCP 445 RPC Endpoint MapperTCP 135 动态 RPC 端口按企业安全基线控制范围6.5 清理会话和凭据任务执行完成后及时清理 SMB 会话和 cmdkey 凭据。net use \\PC-001\IPC$ /delete cmdkey /delete:PC-001推荐把清理动作写进脚本的 finally / 收尾逻辑里不要靠人工记忆。7. 实战模板IPC 会话 执行 清理下面这个模板适合做半自动批量执行。它的核心思路是先建立 IPC 认证会话再执行 PsExec最后清理会话。真实生产中密码来源建议接入密管系统而不是直接写死。echo off setlocal enabledelayedexpansion set HOSTSPC-001 PC-002 PC-003 set USERCONTOSO\opsadmin if not exist logs md logs echo 请输入远端账号密码 set /p PASSPassword: for %%H in (%HOSTS%) do ( echo [%%H] 建立 IPC 会话... net use \\%%H\IPC$ /user:%USER% %PASS% /persistent:no nul 21 if errorlevel 1 ( echo [%%H] 连接失败 logs\summary.txt goto :cleanup_%%H ) echo [%%H] 执行远程命令... psexec \\%%H -nobanner -h cmd /c whoami hostname logs\%%H.out 21 set RC!ERRORLEVEL! echo [%%H] ExitCode!RC! logs\summary.txt :cleanup_%%H net use \\%%H\IPC$ /delete nul 21 ) echo 完成查看 logs 目录。 endlocal上面这个批处理里使用 set /p 输入密码时CMD 默认会显示输入内容。如果要做更安全的密码输入建议改用 PowerShell Get-Credential 或接入凭据管理系统。PowerShell 版本可以使用凭据对象但也要注意密码在内存中的处理方式。$hostsPC-001,PC-002$credGet-Credential-Message输入远端凭据$user$cred.UserName$pw$cred.GetNetworkCredential().PasswordNew-Item-ItemType Directory-Force-Path logs|Out-Nullforeach($hin$hosts){Write-Host[$h] 建立 IPC 会话...cmd/cnet use \\$h\IPC$ /user:$user$pw/persistent:no|Out-Null psexec \\$h-nobanner-h cmd/cwhoami /groups*logs\$h.outWrite-Host[$h] ExitCode$LASTEXITCODEcmd/cnet use \\$h\IPC$ /delete|Out-Null}PowerShell 版本比纯 CMD 更适合扩展成结构化日志、CSV 汇总和异常处理脚本。8. 典型错误与修复清单PsExec 凭据类问题不能看到报错就简单换密码。下面这张表建议直接放进团队 SOP用于现场快速判断。报错 / 现象高概率根因处理建议Access is denied.非管理员、UAC 远程限制、Admin$ 不可访问、SMB 会话冲突验证 Admin$清理net use确认管理员权限必要时处理 UAC 远程限制Make sure that the default admin$ share is enabled...Admin$ 关闭、445 被拦、Server 服务异常检查文件和打印共享、防火墙、LanmanServer服务PSEXESVC could not be installed无写入权限、服务创建失败、EDR 拦截检查权限、SCM/RPC、EDR 白名单、PSEXESVC 残留多重连接错误同一目标已有其他凭据的 SMB 会话执行net use \\host\IPC$ /delete后重新认证管理员仍无法写系统路径拿到受限令牌或未使用高完整性使用域管理员、-h或评估LocalAccountTokenFilterPolicySYSTEM 无法访问共享SYSTEM 无网络凭据使用-u/-p指定有权限账户或先写本地再拉回推荐现场处理顺序先验证 Admin$再验证 SCM/RPC再验证权限令牌最后看 EDR 和安全策略。不要为了快速跑通而关闭 UAC、关闭防火墙、关闭 EDR。这类动作影响范围大后续风险通常比当前问题更大。9. 最小安全使用流程如果把上面的内容压缩成一个可执行流程我建议按下面这条线走。它不是最省事的但在企业终端环境里比较稳。确认远程操作授权选择受控账号避免命令行明文密码验证 ADMIN$ 与 RPC/SCM执行 PsExec 命令记录输出与退出码清理 IPC 会话 / cmdkey 凭据检查 PSEXESVC 残留归档日志与工单这条流程的重点是把 PsExec 从“个人临时工具”变成“可授权、可记录、可回滚、可审计”的企业运维动作。如果只是偶尔单机排障可以简化但如果要批量操作、多用户共享、进入生产终端就不应该再依赖个人习惯。10. 小结PsExec 的备用凭据不是简单的 -u/-p 参数问题而是企业远程执行里的身份、权限、网络和审计问题。真正需要警惕的不是命令写不出来而是命令跑通了却把密码、权限和安全边界处理得很粗糙。这篇文章最重要的几个结论如下优先使用交互式输入、IPC 会话、cmdkey 或密管系统不要把真实密码写在命令行和脚本里。域环境优先使用受控域账号工作组环境要额外关注 UAC 远程限制和本地管理员令牌过滤。执行完成后要清理 SMB 会话、cmdkey 凭据和可能残留的 PSEXESVC 服务。不要把 -h 当成权限放大器不要把 -s 当成万能权限不要为了跑通 PsExec 直接关闭 UAC 或安全软件。从桌面支持和企业运维角度看PsExec 的成熟用法不是“能远程开 cmd”而是能把凭据、权限、日志、清理和审计一起纳入流程。这样既能解决问题也能经得起后续复盘。返回顶部