psexec 远程连接 虚拟机操作步骤的核心答案是:下载微软 Sysinternals 工具包中的 PsExec,在命令行中执行 psexec \目标IP -u 用户名 -p 密码 cmd 即可进入虚拟机命令行界面,但前提是双方网络互通、445 端口可达且具备管理员权限。 这个答案听起来简单,实际部署时却常碰到虚拟机防火墙拦截、账号权限不足、网络模式不通等绊脚石,本文就按实操顺序,把从准备到排错的全过程拆给你看。
psexec 远程连接 虚拟机操作步骤:准备工作要做足
很多教程上来就让你敲命令,结果报错一个接一个,psexec 的原理是在目标机器上临时安装并启动一个 Windows 服务,再通过该服务执行指定命令,这意味着你对目标虚拟机必须有管理员级权限,且网络层面要放行 RPC 和 SMB 通信。
第一步:下载 PsTools 并解压到固定目录
- 访问微软官网的 Sysinternals 套件页面(也就是 Sysinternals 主站的 PsTools 下载区),下载 PsTools.zip 压缩包。
- 解压到你喜欢的目录,
C:PsTools,里面包含 psexec.exe、pskill.exe、pslist.exe 等几十个小工具。 - 为了方便在任何路径下直接调用,建议把该目录加入系统 Path 环境变量,操作路径:右键“此电脑”→ 属性 → 高级系统设置 → 环境变量 → 找到 Path 变量 → 编辑 → 新建 → 填入
C:PsTools。
第二步:确认虚拟机 IP 和网络模式
psexec 通过 IP 地址访问目标虚拟机,所以先明确虚拟机的 IP:
- 桥接模式:虚拟机与宿主机在同一物理网段,宿主机直接 ping 虚拟机 IP 即可。
- NAT 模式:默认情况下,宿主机可以访问虚拟机,但其他物理机无法直接访问,psexec 的发起方是宿主机,NAT 模式通常可行;如果发起方是另一台物理机,则需要端口转发或改用桥接模式。
- 仅主机模式:只允许宿主机与虚拟机通信,跨机器远程连接基本没戏。
用 ipconfig 在虚拟机里查清楚 IP 后,回到宿主机执行 ping 虚拟机IP,不通就去查虚拟网络编辑器。
第三步:开放防火墙和共享端口
psexec 依赖 TCP 445 端口(SMB) 和 Windows 服务管理相关的 RPC 端口,虚拟机如果是 Windows 系统,请重点检查以下两项设置:
- 防火墙:控制面板 → Windows Defender 防火墙 → 允许应用或功能通过防火墙 → 勾选“文件和打印机共享”和“Windows Management Instrumentation (WMI)”。
- 文件共享:在虚拟机中运行
net share查看 ADMIN$ 共享是否存在,如果提示没有共享,手动启动 Server 服务:在服务管理器中找到 Server,设为自动并启动。
psexec 怎么用:从单条命令到交互式 Shell
准备就绪后,正式开始远程连接,以下命令均在发起方的命令提示符或 PowerShell 中执行。
基础命令格式与真实例子
psexec 的标准语法是:
psexec \目标IP -u 账号 -p 密码 要执行的命令
举两个最常见的场景:
-
远程执行一条命令,比如查看虚拟机的网络配置:
psexec \192.168.1.100 -u administrator -p P@ssw0rd ipconfig输出会直接返回到你的终端里,相当于把虚拟机当成一台本地机器用。
-
远程重启虚拟机:
psexec \192.168.1.100 -u administrator -p P@ssw0rd shutdown /r /t 0
进入交互式命令行,像坐在虚拟机前一样操作
如果想连续执行多条命令,或者想直接操作虚拟机上的 cmd,用不带命令参数的写法:
psexec \192.168.1.100 -u administrator -p P@ssw0rd cmd
执行后你会发现命令提示符前缀变成了 C:Windowssystem32> 但其实是远程虚拟机的路径,此模式下,你可以随意敲击 ipconfig、dir、tasklist 等命令,所有操作都在虚拟机内部执行。
把本地文件推到虚拟机再执行
psexec 还支持 -c 参数,把本地文件复制到远程虚拟机后再运行,这个用法在批量部署脚本时相当方便:
psexec \192.168.1.100 -u administrator -p P@ssw0rd -c C:Toolscheck.bat
该命令会把 check.bat 推送到虚拟机的系统目录下,然后远程执行它,执行完临时文件默认保留在远端。
以 SYSTEM 权限运行
有些命令需要更高权限,比如操作注册表安全项或服务配置,加上 -s 参数,就能让 psexec 以 SYSTEM 账户在远程虚拟机中启动进程:
psexec \192.168.1.100 -u administrator -p P@ssw0rd -s cmd
SYSTEM 是 Windows 中的顶级账户,比管理员权限还高,因此务必只在可信环境下使用。
psexec 连接不上 虚拟机?先从这五个角度排查
实际使用中,报错五花八门,我把最常见的几类问题整理成一张排查表,看不懂英文报错也能对号入座:
| 报错信息 | 大概率原因 | 解决方向 |
|---|---|---|
| Access is denied | 账号权限不足或 UAC 远程限制 | 确认虚拟机不是仅来宾账户,关闭远程 UAC 过滤,或用本地管理员账号 |
| Network path not found | 网络不通或 SMB 服务未启动 | ping 测试、确认桥接模式、启动 Server 服务 |
| The RPC server is unavailable | 防火墙拦截 RPC 端口 | 放行 WMI 和 RPC 动态端口,或直接关闭虚拟机防火墙(临时测试) |
| The filename, directory name, or volume label syntax is incorrect | 命令参数写错 | 检查反斜杠和引号,虚拟光驱目录路径注意转义 |
| 登录失败:用户账户限制 | 账号被锁定、密码过期或空密码策略 | 在虚拟机中重设密码,或运行 gpedit.msc 修改账户策略 |
错误 5 拒绝访问是重灾区
如果你用的是 Windows 10/11 专业版工作站或 Windows Server 2016 以上系统,会发现 psexec 即使密码正确也报 Access is denied,这大概率是 UAC 的远程限制在捣鬼:微软从 Vista 开始引入本地账户的 UAC 过滤机制,使得远程登录的管理员令牌被自动降级成普通用户权限。
解决办法有两种:
- 在目标虚拟机中打开注册表编辑器,跳转到
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem,新建一个 DWORD(32 位)值,名为LocalAccountTokenFilterPolicy,数值数据填1,重启机器后生效。 - 直接使用虚拟机内置的 Administrator 账户(不是你自己创建的管理员用户),因为内置 Administrator 默认不受到该策略限制。
测试阶段图省事,可以临时关闭防火墙
如果你只是在实验环境里验证,不想折腾防火墙规则,可以临时在虚拟机里执行:
netsh advfirewall set allprofiles state off
把虚拟机的公共、专用和域网络防火墙全部关掉,之后 psexec 基本畅通无阻,但生产环境千万别这样操作,测试完记得重新开启。
psexec 在虚拟机和物理机上有哪些使用差异
不少第一次用 psexec 连接虚拟机的朋友会被同一种现象困住:同一套命令连物理机一次成功,连虚拟机就各种超时,这是虚拟化环境带来的额外变量。
NAT 模式下,外网物理机访问不到虚拟机
VMware Workstation 或 VirtualBox 默认的 NAT 模式,虚拟机位于一个私有子网中,对外表现为宿主机的网络地址,在这种模式下,宿主机可以主动连接虚拟机,但局域网其他电脑无法直接访问,如果你要从自己的办公电脑上 psexec 到一台公司服务器上的虚拟机,得先确认虚拟机的网络模式是桥接模式,且分配了和宿主机同网段的 IP。
快照回滚之后,服务状态可能不一致
psexec 远程连接时会在虚拟机中创建 PSEXESVC 服务,如果虚拟机的防火墙当时是关闭的,你连接并创建服务后再做快照,一旦回滚到该快照,服务状态与目标机网络配置可能出现奇怪的不一致,比如回滚后 admin$ 共享存在,但 psexec 的临时服务记录残留。建议在干净的网络配置状态下才做快照,否则排查 NLA 错误会浪费大量时间。
虚拟机之间的互联,权限验证更严格
当你从一台虚拟机 psexec 到另一台虚拟机时,除了账号密码之外,Workstation 服务的运行账户也得注意,如果发起方虚拟机没有启动 Workstation 服务,无法建立 SMB 会话,连接直接失败,确认方式:运行 services.msc,找到 Workstation,启动类型设为“自动”。
远程复制文件:psexec 不是唯一办法
虽然 psexec 可以用 -c 把文件推送到虚拟机,但如果你需要在宿主机和虚拟机之间传文件,更推荐 VMware Tools 的共享文件夹功能,或者直接用 copy 命令走 SMB 共享,psexec 的文件复制功能设计上不对大文件做断点续传,传输效率也比较一般。
安全警告:psexec 是运维利器,也是攻击跳板
我用 psexec 管理过几十台实验虚拟机,这东西的效率确实比一次次打开 VMware 窗口强太多,但行业共识认为:psexec 的能力太接近黑客工具了,它本质上就是合法的远程代码执行工具,所以必须有使用纪律。
不要在命令行中明文写密码
-p P@ssw0rd 这种写法虽然在教程里最常见,但在真实环境中特别危险,你的命令历史记录、PowerShell 日志都会留下密码痕迹,安全的做法是:
- 先在命令行执行
net use \虚拟机IP /user:管理员账号,系统会提示你输入密码,输入时不回显。 - 然后再执行
psexec \虚拟机IP 命令,psexec 会复用已建立的 SMB 会话,不再需要-p参数。
用完后立即清理远程服务
psexec 的工作机制是在远程虚拟机上创建 PSEXESVC 服务并启动一个 psexec.exe 进程,任务结束后,正常退出交互式 shell 会自动让远程服务停止并删除自身,但如果 psexec 进程被强制终止或发生故障,远程只读服务会残留下来,可以手动清理:
psexec \虚拟机IP -u 账号 -c psservice.exe stop PSEXESVC
虚拟机做安全测试时,慎用 psexec
如果你拿 psexec 来测试虚拟机是否能防住横向渗透,通常能轻松成功,但样本价值有限,由于 psexec 太出名,几乎所有终端安全软件都会重点监控 PSEXESVC 的创建,在真实攻防场景下反而不常见,验证内网安全性,用 Mimikatz、WMI 或 WinRM 来做测试更有参考意义。
常见问题解决:psexec 远程连接 虚拟机操作步骤里的三个坑
Q1:psexec 远程连接虚拟机时,提示“拒绝访问”,但账号密码明明是对的,为什么?
这基本是 UAC 远程限制在阻止你,目标虚拟机如果是 Windows 10/11、Windows Server 2016 及以上系统,默认情况下非内置 Administrator 的管理员账户通过 SMB 远程登录时,权限会被过滤为普通用户,解决方法:在目标虚拟机注册表 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem 中新建 LocalAccountTokenFilterPolicy 为 1,重启后重新尝试,如果仍失败,确认该账号没有设置“拒绝从网络访问这台计算机”的用户权限分配。
Q2:psexec 连接不上虚拟机,报“找不到网络路径”,是防火墙设置的问题吗?
不一定,虽然防火墙拦截 445 端口是最常见的原因,但虚拟机网络模式不对也会导致此问题,例如虚拟机处于 NAT 模式而发起方与虚拟机不在同一网段,直接 ping 不通,网络路径自然找不到,建议先按顺序检查:第一步在宿主机 ping 虚拟机 IP 确认基本连通;第二步在虚拟机内执行 net share 确认 ADMIN$ 共享存在;第三步查看“网络和共享中心”中是否开启了“网络发现”和“文件和打印机共享”,如果虚拟机是普通 Windows 10 系统,还得确保“网络配置文件”是“专用”而非“公用”。
Q3:psexec 远程命令执行后没有输出,或提示“找不到文件”,但虚拟机里确实能运行?
psexec 远程执行命令时,Windows 服务上下文环境与交互式用户不同,PATH 环境变量可能不包含你所执行文件所在目录,比如你要运行 Python 脚本,而 Python 装在某个用户目录下,远程会话里可能找不到解释器路径,解决办法是使用绝对路径执行:psexec \虚拟机IP -u 账号 -p 密码 C:Python39python.exe C:scripttest.py,psexec 默认把文件复制到虚拟机 C:WindowsSystem32 目录下,如果该目录不具备写入权限,需要先手动放置文件再用完整路径调用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/621325.html





