天天看点

如何使用 PSEXEC 在远程计算机上运行命令

作者:劳资丶蜀道三

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

如何使用 PSEXEC 在远程计算机上运行命令

使用 PsExec 的先决条件

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

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

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

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

如何使用 PSEXEC 在远程计算机上运行命令

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

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

get-service LanmanServer , LanmanWorkstation

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

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

net view \DESKTOP-U97VIM5/all

如何使用 PSEXEC 在远程计算机上运行命令

确保 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 在远程计算机上运行命令

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

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

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

如何使用 PSEXEC 在远程计算机上运行命令

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

psexec /accepteula

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

psexec \lon-srv01 ipconfig /flushdns

如何使用 PSEXEC 在远程计算机上运行命令

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

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 在远程计算机上运行命令

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

Exit

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

如何使用 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 允许您同时在多台远程计算机上运行该命令。为此,您可以设置以逗号分隔的计算机名称:

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% 共享。

如何使用 PSEXEC 在远程计算机上运行命令

确保可以通过 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 并将返回代码设置为零。

继续阅读