PsExec 是一个有用的系统管理员工具,允许您在远程计算机上执行命令和运行程序。 PsExec 的杀手级功能是它允许管理员与远程计算机建立交互式会话,并使用它远程运行程序,并执行任何命令(在后台或以交互模式)。 PsExec 仅提供控制台的命令行界面,可用作轻量级的 telnet 替代品。

使用 PsExec 的先决条件

PsExec 必须满足以下要求才能连接到远程计算机:

远程计算机必须打开 TCP/445 (SMB) 和 UDP/137 (NETBIOS) 端口,并且应在 Windows Defender 防火墙中启用文件和打印机共享例外。建议仅为专用网络和域网络配置文件打开这些端口,以降低安全风险。

您可以在 Windows Defender 防火墙设置 (GUI) 中或使用以下命令在远程计算机上允许文件和打印机共享功能:

Set-NetFirewallRule -DisplayGroup “File And Printer Sharing” -Enabled True -Profile Private

您的帐户必须具有目标远程计算机上的本地管理权限;

LanmanServer 和 LanmanWorkstation 服务必须在远程主机上运行:

get-service LanmanServer , LanmanWorkstation

必须在远程计算机上启用默认的 admin$ 共享。

确保 ADMIN%(远程管理)和其他 Windows 管理共享(C$、IPC$)已在远程计算机上发布:

net view \DESKTOP-U97VIM5/all

确保 ADMIN%(远程管理)和其他 Windows 管理共享(C$、IPC$)已在远程计算机上发布:

如果远程计算机上的管理员共享列表为空,请在远程计算机上运行以下命令来发布默认管理员共享:

reg add HKLMSYSTEMCurrentControlSetServiceslanmanserverparameters /f /v AutoShareWks /t REG_DWORD /d 0

然后重新启动远程计算机。

您还必须禁用远程 UAC,这会阻止工作组计算机上管理员帐户的远程访问:

reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem" /v "LocalAccountTokenFilterPolicy" /t REG_DWORD /d 1 /f

如何在 Windows 上安装 PsExec?

要使用 PsExec 工具,只需从 Microsoft 下载 PSTools.zip 存档并将 PsExec64.exe 和 PsExec.exe 文件解压到管理员计算机的任何文件夹中(可以方便地将其复制到默认可执行文件夹 C:WindowsSystem32 )。

您现在可以使用 PsExec 连接到远程计算机。

PsExec 的语法如下:

psexec \RemotePCName [-u username[-p password]] command [arguments]

您只需在命令行中键入 psexec(不带任何参数)即可列出所有可用的 PsExec 选项。

某些防病毒软件可能会将 Psexec.exe 检测为恶意软件、PUA(可能不需要的应用程序)、黑客工具或远程管理工具。如果您是从 Microsoft 网站下载的,则可以确保 PsExec 不包含病毒。然而,PsExec 经常被病毒和黑客用来利用安全漏洞并远程控制受感染的计算机。

如果您尚未指定用户名和密码,PsExec 进程将使用您当前的凭据在远程计算机上启动。从版本 2.1 开始,PsExec 在通过网络传输时对用户凭据进行加密(在以前的版本中,密码以明文形式发送)。

首次运行 PsExec 时,您必须接受 Sysinternals 许可协议。

为了防止显示图形许可协议提示,您可以在第一次运行 PsExec 时添加 /accepteula 开关。

psexec /accepteula

在以下示例中,我们将使用 PSExec 刷新远程计算机 lon-srv01 上的 DNS 缓存:

psexec \lon-srv01 ipconfig /flushdns

如果程序的路径中有空格,则必须将其用双引号引起来:

psexec \lon-srv01 "c:\Program Files (x86)app1app.exe"

PsExec 如何工作?

PsExec 将 psexesvc.exe 文件复制到远程计算机的隐藏管理文件夹 Admin$ (C:WindowsSystem32psexesvc.exe);

然后它通过 Windows 服务控制管理器 API 启动远程计算机上的 PSEXESVC 服务;

您的本地 PsExec 进程使用命名管道连接到远程 PSEXESVC 服务,将您的命令发送到远程计算机,并等待结果;

该命令的文本输出将发送到您的计算机,并且错误代码将显示在您的控制台中。如果命令成功,您将看到退出代码 0。

任务完成后,PsExec 会停止服务并自动将其从远程计算机中删除。

暗示。如果按 Ctrl-C 键结束远程 PsExec 会话,PSEXESVC 服务不会自动删除。您可以使用以下命令手动删除此服务:

sc.exe \lon-srv01 delete psexesvc

当您在远程用户下通过 PsExec 以交互方式运行 cmd.exe 时,在启用 UAC 时,您无法提升权限(作为管理员)。要使用帐户的提升令牌运行命令,请使用 –h 选项。此选项导致 PsExec 会话中的所有命令以“以管理员身份运行”模式运行。

PsExec 用法示例

让我们看一些使用 PsExec 在远程计算机上执行命令的有用示例。

要重新启动远程计算机,请运行以下命令:

psexec \lon-srv01 "cmd.exe" "/c shutdown /f /r/ /t 60"

如果需要一一运行多个命令,最好在远程计算机上以交互模式运行 PsExec。为此,请运行命令:

psexec \lon-srv01 cmd

这将打开一个交互式命令提示符。您在控制台中键入的所有命令都将在远程 lon-srv01 计算机上执行。

要停止交互式 PsExec 会话,请运行以下命令:

Exit

添加 -nobanner 选项以隐藏每次运行 psexec 时出现的版权消息:

要使用特定帐户连接到远程计算机并运行交互式 shell,请使用以下命令:

psexec.exe \lon-srv01 -u user -p password cmd.exe

您甚至可以使用 PsExec 远程运行 PowerShell 命令。例如,以下命令将返回远程计算机上 C:PS 目录的大小:

psexec \lon-srv01 powershell -ExecutionPolicy RemoteSigned -command "'{0:N2}' -f ((gci C:PS | measure Length -Sum).Sum/1MB)"

-c 参数允许您指定要复制并在远程计算机上运行的本地文件的名称。例如:

psexec \lon-srv01 -c c:psmyapp.exe

您可以使用 PsExec 作为远程安装软件的最简单方法。例如,您有某个程序的安装程序文件(例如 setup.msi)。要将 msi 文件复制到远程计算机并安装它,请使用以下一行:

psexec.exe \lon-srv01 -c setup.msi –i –s "msiexec.exe /i setup.msi"

默认情况下,PsExec 不允许在远程用户的桌面上启动 GUI 程序。 PsExec 以隐藏模式执行命令(您在执行命令的远程计算机上看不到任何窗口或对话框)。但是,您可以使用 -i 选项更改此设置。

例如,以下 PsExec 命令将打开远程计算机上的 notepad.exe 进程并将其显示在用户桌面上:

psexec -i \lon-srv01 notepad

然后,PsExec 将等待远程计算机上完成此过程。

PsExec 将等待远程计算机上运行的进程完成。如果远程用户不关闭桌面上的记事本窗口,您的 PsExec 进程将无限期地等待它完成。您可以使用 -d 开关来阻止 PsExec 等待远程进程完成:

psexec -i -d \lon-srv01 notepad

使用 PsExec 以本地系统帐户运行命令

PsExec 有一个有趣且有用的功能。您可以使用 -s 开关在 SYSTEM 帐户下运行本地计算机上的任何命令或程序。例如,运行 CLI 会话:

psexec -s cmd

使用 whoami 命令检查您当前登录的用户。如您所见,控制台是从 NTAuthoritySystem 帐户启动的。

如何使用 PsExec 在多台远程计算机上运行命令

PsExec 允许您同时在多台远程计算机上运行该命令。为此,您可以设置以逗号分隔的计算机名称:

psexec \PC1,PC2,PC3,PC33 “ipconfig /all”

或者将计算机列表保存到文本文件(每行一个主机名),然后指定该文件的路径:

psexec @c:pscomputer_list.txt ipconfig

如果您输入星号 (psexec \*) 而不是计算机名称,则该命令将在域中的所有计算机上执行(您只能在加入域的计算机上使用此技巧)。

例如,以下命令会将 run.bat 文件复制到文本文件 c:pscomputer_list.txt 中列出的所有计算机,并执行此批处理(-h 参数用于运行提升的批处理):

PsExec.exe @c:pscomputer_list.txt -h -u .administrator -p $upper0P@$ -c "c:psrun.bat"

常见 PsExec 错误

PsExec 访问被拒绝错误

在某些情况下,尝试使用 PsExec 连接远程计算机时可能会出现以下错误:

无法访问计算机名

找不到网络路径

确保在 computername 上启用默认的 admin% 共享。

确保可以通过 SMB(TCP 端口 445)通过网络访问远程计算机。您可以使用以下 Test-NetConnection PowerShell 命令测试与远程计算机的连接:

Test-NetConnection -ComputerName pc99 -Port 445

检查命令响应。如果 TcpTestSucceeded 不等于 True,则表示该端口被防火墙阻止。

如果您的帐户没有远程 Windows 主机的本地管理员权限,则会出现错误:

无法安装/启动 PSEXESVC 服务:
拒绝访问

PsExec:登录失败

连接到远程计算机时,可能会出现以下 PsExec 错误:

PsExec 无法在 PCName 上启动 cmd.exe:
登录失败:尚未授予用户在此计算机上请求的登录类型。

在这种情况下,您需要将以下选项添加到 PsExec 命令中:

PsExec.exe -i –h PCName yourcommand

PSExec 错误代码 1

如果当您在远程计算机上运行批处理文件时 PsExec 返回“错误代码 1”,则您很可能在 bat 文件中使用了 exit 命令。将退出命令更改为

exit / b 0

此类命令将终止批处理文件、关闭 cmd.exe 并将返回代码设置为零。