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 并将返回代码设置为零。