当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 您想了解的有关 Psexec 的一切

作者:精品下载站 日期:2024-12-14 20:51:29 浏览:15 分类:玩电脑

您想了解的有关 Psexec 的一切


如果有一个命令行实用程序可以在实用性方面与 robocopy 竞争,那就是 PsExec。 Sysinternals PsExec 实用程序在 IT 管理工具库中无处不在。该工具允许管理员远程运行命令,就像在本地计算机上一样。

为了深入介绍 PsExec 工具,在 ATA 终极指南中介绍这个令人垂涎的工具是合适的。在本指南中,您将了解 psexec 是什么、它的功能以及如何使用这个有用工具的许多示例。

什么是 PsExec.exe?

如果您是 IT 新手,或者可能不需要在远程计算机上运行命令和工具,您可能不知道 psexec 是什么。

PsExec 或 psexec.exe 是为 Windows 构建的命令行实用程序。它允许管理员在本地和更常见的远程计算机上运行程序。它是 Mark Russinovich 多年前构建的 Sysinternals pstools 套件的免费实用程序部分。

它是为了取代 telnet 等工具而构建的,这些工具迫使您打开端口并引入安全漏洞。如今,我们还有其他选项,例如 PowerShell Remoting 和 Invoke-Command PowerShell cmdlet,但 PsExec 仍然占有一席之地。

PsExec 允许控制台应用程序完全交互,而无需安装任何软件。正如您将通过本终极指南看到的那样,PsExec 可以启动交互式命令提示符、在远程计算机上作为本地系统运行、同时在多台计算机上运行命令等等。

它支持自 Windows XP 以来的所有 Windows 版本。这意味着,是的,Windows 10 上的 PsExec 也是一个东西。这是一个运行简单的工具,几乎适用于所有东西,但不要将其简单性与其功能混淆!

先决条件

您只需运行现代 Windows 操作系统即可让 PsExec 在本地计算机上运行。但是,您需要对远程计算机运行 psexec。为此,您需要确保一些项目就位。

如果您现在还没有这些物品或不确定,请不要担心。在下一节中,我们将介绍如何编写一些 PowerShell 来测试远程计算机。

  • 现代 Windows 计算机(本地)
  • 文件和打印机共享打开(远程计算机,TCP 端口 445)
  • 可用的admin$管理共享(远程计算机)
  • 您知道本地帐户的凭据(远程计算机)

截至撰写本文时,PsExec 的版本为 v2.2,您将在本文中了解该版本。

安装 PSexec(使用远程计算机设置)

从技术上讲,您不需要安装 PsExec,因为它只是一个命令行实用程序,但已经足够接近了。由于无需安装,您只需下载 PsTools zip 文件并将其解压即可。 PsExec 不能作为独立实用程序使用,而是 PsTools 工具套件的一部分。

下载 PSExec

您可以手动提取 ZIP 文件,也可以使用以下方便的 PowerShell 代码段来下载 PsExec 并从其 pstools ZIP 文件中提取 PsExec。请注意,这会删除所有其他 PsTools 工具。许多仍然很方便,但我们不会在本文中介绍这些内容。

PS> Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/PSTools.zip' -OutFile 'pstools.zip'
PS> Expand-Archive -Path 'pstools.zip' -DestinationPath "$env:TEMP\pstools"
PS> Move-Item -Path "$env:TEMP\pstools\psexec.exe" .
PS> Remove-Item -Path "$env:TEMP\pstools" -Recurse

远程计算机配置

下载 PsExec 后,您需要确保要运行它的任何远程计算机都处于打开状态。 PsExec 的要求很简单; 文件和打印机共享已启用,并且admin$管理共享可用。

您可以转到所有远程计算机,打开Windows 防火墙小程序,转到允许的应用程序并在所有远程计算机上启用文件和打印机共享如下所示的计算机。

请注意,文件和打印机共享是已知的安全风险,因此请确保仅启用专用防火墙配置文件。

或者您可以访问每台计算机并运行 netsh 实用程序以通过以下方式打开它:

> netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=Yes

或者您可以使用 PowerShell 的 Set-NetFirewallRule cmdlet 来执行此操作。

PS51> Set-NetFirewallRule -DisplayGroup "File And Printer Sharing" -Enabled True -Profile Private

如果您不想访问每台计算机,则可以使用 PowerShell Remoting 并且位于 Active Directory 域中,您还可以使用 Invoke-Command cmdlet 在多台计算机上同时打开防火墙。

PS51> Invoke-Command -ComputerName PC1, PC2, PC3 -ScriptBlock { Set-NetFirewallRule -DisplayGroup "File And Printer Sharing" -Enabled True -Profile Private }

使用 PsExec

在你能跑之前,你需要先走。如果您以前从未使用过 PsExec,那么您将会大饱眼福!请务必先阅读本节,以熟悉基础知识,然后再深入本文后面的内容。

第一次在新系统上运行 PsExec 时,您将立即看到 PsExec 许可协议出现。您必须单击同意按钮才能开始使用它。

如果您想阻止显示许可协议,可以使用 /accepteula 开关静默接受它,如下所示。

> psexec /accepteula

在本文后面,您将学习一些在本地和远程计算机上消除此 EULA 弹出窗口的技巧。

寻求帮助

在探索 PsExec 时,您根本不应该使用任何开关。当您仅运行不带任何开关的 psexec 时,它将返回所有选项以及每个选项的简要说明。为了您的方便,所有选项都在下表中。

-a

使用逗号分隔可以运行应用程序的处理器,其中 1 是编号最小的 CPU。例如,要在 CPU 2 和 CPU 4 上运行应用程序,请输入:“-a 2,4”

-c

将指定的程序复制到远程系统上执行。如果省略此选项,则应用程序必须位于远程系统上的系统路径中。

-d

不要等待进程终止(非交互式)。

-e

不加载指定帐户的配置文件。

-f

即使文件已存在于远程系统上,也复制指定的程序。

-i

运行该程序,以便它与远程系统上指定会话的桌面进行交互。如果未指定会话,则进程在控制台会话中运行。有些人报告说,由于窗口难以理解,因此始终使用 -s 开关和 -i 来获得最佳结果。

-h

如果目标系统是Vista或更高版本,有proc

-l

以受限用户身份运行进程(剥离管理员组并仅允许分配给用户组的权限)。在 Windows Vista 上,该进程以低完整性运行。

-n

指定连接到远程计算机的超时(以秒为单位)。

-p

指定用户名的可选密码。如果您忽略此项,系统将提示您输入隐藏密码。

-r

指定要创建或交互的远程服务的名称。和。

-s

在系统帐户中运行远程进程。

-u

指定用于登录计算机的可选用户名。

-v

仅当指定文件的版本号高于远程系统上的版本号或更新时才复制该文件。

-w

设置进程的工作目录(相对

-x

在 Winlogon 安全桌面上显示 UI(仅限本地系统)。

-arm

指定远程计算机是 ARM 架构。

-priority

指定 -low、-belownormal、-abovenormal、-high 或

-realtime

以不同的优先级运行该进程。使用

-background

在 Vista 上以低内存和 I/O 优先级运行。

computer

指示 PsExec 在指定的计算机上运行应用程序。如果省略计算机名称 PsExec 将在本地系统上运行应用程序,并且如果指定通配符 (\*),则 PsExec 将运行

@file

PsExec 将在文件中列出的每台计算机上执行该命令。

-accepteula

该标志禁止显示许可证对话框。

-nobanner

不显示启动横幅和版权消息。

运行简单的远程命令

最基本的是,PsExec 需要两个参数:计算机名称和要运行的命令。如果您要在远程计算机上运行的命令不需要任何参数(例如主机名),则只需将其添加在计算机名称后面即可。

请注意,如果不指定完整文件路径,则要运行的命令必须位于用户或系统路径中。另外,如果您的程序名称中包含空格,您始终可以将该程序括在空格中,例如“my application.exe”。

> psexec \REMOTECOMPUTER hostname

您可以在下面看到,要在 CONTOSODC1 计算机上执行 hostname 命令,您需要定义它的 UNC 路径,后跟该命令。然后,PSExec 将安全地连接到远程计算机,执行命令并返回输出。在本例中,hostname 命令返回计算机的主机名,即 CONTOSODC1

如果命令不是 cmd 或其他控制台,PsExec 将快速退出远程会话并返回远程进程返回的退出代码。

注意:从 psexec 返回的错误或退出代码不是来自 PsExec 本身。相反,它来自 psexec 在远程计算机上执行的命令。

PsExec 如何在远程计算机上工作

PsExec 通过几个步骤在远程计算机上执行程序。

  1. C:\Windows中创建PSEXESVC.exe文件。
  2. 在远程计算机上创建并启动名为 PsExec 的 Windows 服务。
  3. 在psexesvc.exe的父进程下执行该程序。
  4. 完成后,PsExec Windows 服务将停止并删除。

当该过程无法 100% 正确运行时,您可能必须使用 sc 命令手动删除该服务。

运行简单的本地命令

尽管 PsExec 因在远程计算机上运行命令而闻名,但您也可以在本地运行命令。

您只需不提供如下所示的计算机名称即可在本地运行命令。

> psexec <local command or EXE file>

你为什么要这样做?原因之一是作为本地 SYSTEM 帐户执行命令。您可以使用 -s 开关在本地或远程以 SYSTEM 身份运行任何命令,稍后您将了解更多信息。

看看下面的短视频。请注意,您只需提供 -s 开关以及 psexec 的命令解释器可执行文件即可以 NT AUTHORITY\SYSTEM 身份启动新的命令会话。

[玩转系统] 您想了解的有关 Psexec 的一切

PsExec 命令(更高级)

一旦掌握了基础知识,您就可以开始学习 psexec 中更高级的技术。 PsExec 可以做的不仅仅是在一台计算机上运行单个命令。

在多台计算机上运行命令

PsExec 不仅限于一次在一台远程计算机上运行命令。该工具还支持同时在多台计算机上复制程序和运行命令。

您可以通过几种不同的方式同时在多台计算机上运行 PsExec。

以逗号分隔的计算机名称

通常,当在单个远程计算机上运行命令时,您将指定一个计算机名称,例如 \REMOTECOMPUTER。您还可以指定用逗号分隔的多台计算机,如下所示。

> psexec \REMOTECOMPUTER1,REMOTECOMPUTER2,REMOTECOMPUTER3

Active Directory 域中的所有计算机

如果您在加入 Active Directory 域的计算机上运行 PsExec,并且希望在该域中的所有计算机上执行命令,请使用通配符。

PsExec 将搜索整个 Active Directory 域并尝试在每台计算机上运行命令。下面是有关 PsExec 如何尝试连接到执行计算机所属域中的每台计算机并运行 hostname 命令的示例语法。

> psexec \* hostname

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Enumerating domain...

请注意,如果您使用星号查找域中的所有计算机,而本地计算机是工作组的一部分,您将收到错误发生系统错误:6118 >

使用通配符会强制 PsExec 本质上运行命令 net view /all 以首先查找域中的所有计算机。这是一种过时的查找计算机信息的方法,因为它依赖于 NetBIOS。

从文件中读取

另一种可以同时在多台计算机上运行命令的方法是使用文本文件。使用语法 @,PsExec 将读取文本文件中的每一行,就好像它是计算机名称一样。然后它将单独处理每台计算机。

下面您可以看到使用 PowerShell 创建以行分隔的计算机名称的文本文件并将其用作 psexec 的输入的示例。

PS51> (Get-AdComputer -Filter *).Name | Out-File computers.txt
PS51> psexec @computers.txt hostname

将本地程序复制到远程计算机

使用 -c 开关,psexec 将在执行之前将任何本地程序复制到远程计算机。

也许您本地计算机上的 C:\Tools 文件夹中有一个 EXE,并且希望在远程计算机上运行它。您可以使用以下语法来执行此操作:

> psexec \REMOTECOMPUTER -c C:\Tools\program.exe

当您使用 -c 开关并且不指定可执行文件时,PsExec 仍会复制该文件,但您会收到一条错误消息,指出系统找不到指定的文件。 发生这种情况是因为 PsExec 将始终尝试运行您复制的文件。

如果您需要在使用 PsExec 之前将文件复制到远程计算机,请改用 Copy-Item PowerShell cmdlet。

在备用凭据下运行远程进程

PsExec 的另一个流行用例是在备用帐户下运行命令。默认情况下,PsExec 将尝试使用您当前登录的帐户连接到远程计算机。更具体地说,它将模拟您在远程计算机上的帐户。

使用 -u 和可选的 -p 开关允许您使用备用用户帐户连接到远程计算机。然后,PsExec 将加密用户名和密码并将其发送到远程计算机进行身份验证。

例如,如果您在工作组中,则始终需要指定用于对远程计算机进行身份验证的用户名。

> psexec \REMOTECOMPUTER hostname -u localadmin -p secret-p@$$word

如果两台计算机都是 Active Directory 的成员,请务必在用户帐户前面加上域名。

> psexec \REMOTECOMPUTER hostname -u contoso.local\domainadmin -p secret-p@$$word

请注意,当您不使用 -u 开关时,psexec 会模拟您在远程计算机上登录的帐户。它将无权访问任何网络资源。

作为本地系统帐户运行进程

在备用帐户下运行 PsExec 最有用的功能之一是使用 -s 开关。此开关允许 PsExec(以及您的远程执行的应用程序)在远程(或本地)计算机的本地系统帐户下运行。

请注意,下面我没有包含远程计算机名称。 PsExec 也很乐意在本地计算机上运行。在本例中,我使用 -s 选项告诉 PsExec 以 LOCAL SYSTEM 帐户启动本地命令提示符。

要在远程计算机上以本地系统身份运行命令提示符,请将计算机名称添加到引用中,如下所示:

> psexec -s \REMOTECOMPUTER cmd

远程启动 GUI 应用程序

另一个有用的 PsExec 开关是 -i。默认情况下,PsExec 不允许远程执行的命令在远程计算机上打开任何窗口。这很有用,因为如果您远程执行命令,您无论如何都不会看到屏幕。

但也许您需要为您的用户启动程序。您个人不会使用该应用程序,但最终用户会。在这种情况下,请使用 -i 开关。

也许您需要在远程计算机上打开记事本窗口。不是问题。使用 -i 开关运行 notepad.exe,PsExec 将打开记事本。

> psexec -i \REMOTECOMPUTER notepad

当交互式窗口打开时,请务必使用 -d 开关断开连接。默认情况下,PsExec 将等待它执行的进程完成。如果远程进程(本例中为记事本)继续运行,PsExec 将永远不会返回控制权。

-d 开关与 -i 一起使用将告诉 PsExec 不要等待远程进程完成。相反,一旦执行远程进程,它就会断开连接并将控制权返回给您。

重定向输出

Psexec 将依赖从远程进程发送到本地会话的任何输出。通常,此输出将直接发送到您的本地控制台。但如果您想重定向它,可以使用典型的重定向运算符来实现。

例如,如果您想运行命令并静音所有输出,则可以使用 ^> nul ^2^&1 将输出和错误重定向到 null。

请注意,特殊字符是用帽子转义的。 (^)。

PsExec 用例

一旦您学会了如何使用 psexec,您将不可避免地遇到各种特定的用例。在本节中,您将学习一些使用 psexec 的实际用例和示例。

启动远程命令提示符 (psexec cmd)

最常见的用例之一是将 PsExec 作为交互式命令提示符启动。 PsExec 不仅仅远程运行命令。它还可以将命令输出发送回您的控制台。正因为如此,它可以成为一个很好的 telnet(如果有人仍在使用它)或者 PowerShell Enter-PSSession 替代品。

要启动远程命令,请指定远程计算机名称并运行cmd应用程序。 Cmd 是 Windows 命令解释器。由于 PsExec 支持交互式使用,因此它会很乐意返回闪烁的光标和提示。

> psexec \REMOTEPC cmd

至此,世界尽在你的掌握之中。您可以通过此“嵌套”命令提示符在本地计算机上运行命令,它们将在远程计算机上执行。

要退出命令提示符,请键入 exit。 PsExec 将停止远程计算机上的 cmd 进程并将焦点返回到本地计算机。

请勿使用 Ctrl-C 关闭交互式 cmd 会话。始终使用exit。如果您使用 Ctrl-C,psexec 会话将在远程计算机上保持运行。

远程安装软件

您可以使用 PsExec 作为穷人的软件部署工具。也许您有一个 MSI 安装程序,需要在一台或多台远程计算机上运行,名为 setup.msi。需要将此安装程序复制到远程计算机,然后通过一些开关使用 msiexec.exe 实用程序执行。

下面是如何使用 PsExec 远程部署软件的示例。此示例将setup.msi复制到远程计算机,然后以SYSTEM帐户的身份以交互方式启动MSI安装程序。

> psexec.exe \REMOTECOMPUTER -i -s "msiexec.exe /i setup.msi" -c setup.msi

不使用 /accepteula 开关接受 EULA

如前所述,首次运行 PsExec 时,您必须接受 EULA。您可以使用 /accepteula 开关,但也可以将其“暂存”在注册表中。

首次启动时,PsExec 在 HKCU\Software\Sysinternals\PsExec 处创建一个注册表项。它创建一个名为 EulaAccepted 且 DWORD 值为 1 的注册表值,而不是该注册表项。

使用您最喜欢的方法修改远程计算机上的注册表,您只需在要运行 PsExec 的计算机上创建此键/值即可。创建后,无需运行 /accepteula

PowerShell 和 PsExec 的结合

在 PowerShell 之前,我们拥有的只是 PsExec。现在,我们有选择。 PowerShell 在许多情况下可以取代 PsExec,但在其他情况下可以对其进行补充。

使用 PowerShell 构建计算机名称

您可以使用 PowerShell,而不是使用 \* 查找域中的所有计算机。通过使用 PowerShell,您不仅可以选择某些计算机,而且不必使用易受防火墙影响的 net view /all 行为。

您可以使用 PowerShell 创建一个字符串,其中包含以逗号分隔的所有计算机名称。然后,您可以将该字符串传递给 PsExec,它将像您手动键入每个字符串一样愉快地处理每个字符串。

您可以在下面看到使用 ActiveDirectory PowerShell 模块的 Get-AdComputer cmdlet 部分的示例。

PS51> psexec "\$((Get-AdComputer -Filter *).Name -join ',')" hostname

远程启用 PowerShell 远程处理

如果您有远程计算机,您更愿意使用 PowerShell Remoting 而不是 PsExec,则可以使用 PsExec 来启用它们。

通过在远程计算机上运行 Enable-PSRemotingwinrm.cmd 批处理文件,您可以快速在多台计算机上同时打开 PowerShell 远程处理。

下面您可以看到在以 SYSTEM 帐户运行的远程计算机上调用 winrm.cmd 批处理文件的示例。由于不需要该命令的输出,因此使用 2>&1> $null 将其静音。

$computerName = 'REMOTECOMPUTER'
psexec "\$Computername" -s c:\windows\system32\winrm.cmd quickconfig -quiet 2&>&1> $null 

PsExec 错误消息

值得一提的是,您看到的从 PsExec 返回的大多数错误代码都来自远程进程;不是来自 PsExec。但了解这些错误代码及其可能的含义会很有帮助。

如果您想了解所有 Windows 错误代码的参考,我建议您查看这份详尽的 Windows 错误代码列表。

以下是您可能会看到 PsExec 返回的常见错误代码的列表。

-2146232576

通常在发生错误时由 Windows Update 返回。

0

命令执行成功

1

功能不正确。出现问题了。就是这样。

1603

安装过程中发生致命错误。这通常由 msiexec 返回。

2

该系统找不到指定的文件

4

系统无法打开该文件。

5

访问被拒绝。

6

句柄无效。

6118

该工作组的服务器列表当前不可用

您的反馈

ATA 终极指南很大。其中有很多信息,我肯定会在这里或那里错过一些东西或犯错误。如果您发现任何错误或认为应该在本指南中添加某些内容,请通过评论告诉我。我很乐意在帖子中注明您的身份。

制作人员

  • 感谢 Mathias(评论)的大量反馈。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯