如果有一个命令行实用程序可以与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版本。这意味着,是的,PsExec在Windows 10上也适用。这是一个简单的工具,几乎适用于所有场景,但不要把它的简单性与其功能混淆!
先决条件
您只需在本地计算机上运行现代Windows操作系统,即可在其上运行PsExec。但是,您可能希望对远程计算机运行psexec。为此,您需要确保几项条件已就位。
如果您现在还没有或不确定这些条件是否已就位,不用担心。在下一节中,我们将介绍如何编写一些PowerShell来测试您的远程计算机。
- A modern Windows computer (local)
- 文件和打印机共享开启(远程计算机,TCP端口445)
- 存在admin$管理共享(远程计算机)
- 您知道本地账户的凭据(远程计算机)
截至撰写本文时,PsExec的版本为v2.2,这也是您将在本文中了解到的版本。
安装PSexec(带远程计算机设置)
技术上,你不需要安装 PsExec,因为它只是一个命令行实用程序,但差不多。由于不需要安装,你只需下载并从 PsTools 压缩文件中提取它。PsExec 不作为独立实用程序提供,而是作为 PsTools 套件中的一部分。
下载 PSExec
你可以手动提取 ZIP 文件,或者使用下面的 PowerShell 片段从其 pstools ZIP 文件中下载并提取 PsExec。请注意,这会移除所有其他 PsTools 工具。许多仍然很方便,但我们不会在本文中涵盖它们。
远程计算机配置
一旦你下载了 PsExec,你需要确保要运行它的任何远程计算机是开放的。PsExec 有简单的要求;启用文件和打印机共享,并且admin$ 管理共享可用。
你可以访问所有远程计算机,打开Windows 防火墙,转到允许的应用程序,并在所有计算机上启用文件和打印机共享,如下所示。
请注意文件和打印机共享是已知的安全风险,因此确保仅启用私有防火墙配置文件。

或者,你可以访问每台计算机并通过以下方式运行 netsh 实用程序打开它:
或者,你可以使用 PowerShell 的 Set-NetFirewallRule
命令来执行。
如果您不想访问每台计算机,您可以使用PowerShell Remoting,如果您在Active Directory域中,还可以使用Invoke-Command
cmdlet一次性打开许多计算机的防火墙。
使用PsExec
在您能够奔跑之前,您需要学会走路。如果您以前从未使用过PsExec,那么您将会有所收获!确保首先阅读本节,以便在本文后面深入研究之前先入门基础知识。
第一次在新系统上运行PsExec时,您将立即看到PsExec许可协议出现。您需要点击同意按钮才能开始使用它。

如果您希望阻止许可协议显示,可以使用下面所示的/accepteula
开关来静默接受它。
稍后在本文中,您将学习到一些在本地和远程计算机上静音此EULA弹出窗口的技巧。
寻求帮助
在探索PsExec时,您不应该使用任何开关。当您简单运行psexec而不带任何开关时,它将返回所有选项以及每个选项的简要解释。以下是所有选项的表格,以便您参考。
Switch | Explanation |
---|---|
-a | Separate processors on which the application can run with commas where 1 is the lowest numbered CPU. For example, to run the application on CPU 2 and CPU 4, enter: “-a 2,4” |
-c | Copy the specified program to the remote system for execution. If you omit this option the application must be in the system path on the remote system. |
-d | Don’t wait for process to terminate (non-interactive). |
-e | Does not load the specified account’s profile. |
-f | Copy the specified program even if the file already exists on the remote system. |
-i | Run the program so that it interacts with the desktop of the specified session on the remote system. If no session is specified the process runs in the console session. Some have reported best results always using the -s switch with -i due to windows being unintelligible. |
-h | If the target system is Vista or higher, has the proc |
-l | Run process as limited user (strips the Administrators group and allows only privileges assigned to the Users group). On Windows Vista the process runs with Low Integrity. |
-n | Specifies timeout in seconds connecting to remote computers. |
-p | Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password. |
-r | Specifies the name of the remote service to create or interact. with. |
-s | Run the remote process in the System account. |
-u | Specifies optional user name for login to computer. |
-v | Copy the specified file only if it has a higher version number or is newer on than the one on the remote system. |
-w | Set the working directory of the process (relative |
-x | Display the UI on the Winlogon secure desktop (local system only). |
-arm | Specifies the remote computer is of ARM architecture. |
-priority | Specifies -low, -belownormal, -abovenormal, -high or |
-realtime | run the process at a different priority. Use |
-background | run at low memory and I/O priority on Vista. |
computer | Direct PsExec to run the application on the computer or computers specified. If you omit the computer name PsExec runs the application on the local system, and if you specify a wildcard (\*), PsExec runs |
@file | PsExec will execute the command on each of the computers listed in the file. |
-accepteula | This flag suppresses the display of the license dialog. |
-nobanner | Do not display the startup banner and copyright message. |
运行简单的远程命令
在其最基本的形式中,PsExec需要两个参数:计算机名称和要运行的命令。如果您有一个要在远程计算机上运行的命令,不需要任何参数,比如hostname
,您可以简单地在计算机名称之后添加它。
请注意,如果您没有指定完整的文件路径,要运行的命令必须在用户或系统路径中。此外,如果您有一个名称中包含空格的程序,您可以始终将程序括在空格中,如“my application.exe”。
您可以看到下面的例子,在CONTOSODC1计算机上执行hostname
命令,您需要定义它的UNC路径,然后加上命令。然后,PSExec将安全地连接到远程计算机,执行命令并返回输出。在这种情况下,hostname
命令返回计算机的主机名,即CONTOSODC1。
如果命令不是cmd
或其他控制台,PsExec将迅速退出远程会话并返回远程进程返回的退出代码。
注意:从psexec返回的错误或退出代码并非来自PsExec本身。相反,它来自psexec在远程计算机上执行的命令。

PsExec在远程计算机上的工作原理
PsExec执行远程计算机上程序的几个步骤。
- 在C:\Windows中创建一个PSEXESVC.exe文件。
- 在远程计算机上创建并启动名为PsExec的Windows服务。
- 在psexesvc.exe的父进程下执行该程序。
- 完成后,PsExec Windows 服务将停止并被移除。
当进程不能百分之百正确运行时,您可能需要使用sc命令手动移除服务。
运行简单的本地命令
尽管PsExec以在远程计算机上运行命令而闻名,但您也可以在本地运行命令。
您可以通过简单地不提供计算机名称来在本地运行命令,如下所示。
为什么要这样做呢?一个原因是以本地SYSTEM账户执行命令。您可以使用-s
开关在本地或远程运行任何命令,稍后您将了解更多信息。
看一下下面的简短视频。注意,您只需要提供-s
开关以及psexec的命令解释器可执行文件,即可启动一个新的命令会话作为NT AUTHORITY\SYSTEM。

PsExec命令(更进一步)
一旦掌握了基础知识,您就可以开始学习psexec中更高级的技术。PsExec不仅仅可以在单台计算机上运行单个命令。
在多台计算机上运行命令
PsExec不仅仅局限于一次在单台远程计算机上运行命令。这个工具还支持在多台计算机上复制程序并运行命令。
您可以通过几种不同的方式同时在多台计算机上运行PsExec。
逗号分隔的计算机名称
通常在单个远程计算机上运行命令时,您会指定单个计算机名称,如\\REMOTECOMPUTER
。您也可以像下面这样用逗号分隔指定多个计算机。
活动目录域中的所有计算机
如果您在活动目录域联接的计算机上运行 PsExec,并且希望在该域中的所有计算机上执行命令,可以使用通配符。
PsExec 将搜索整个活动目录域,并尝试在每台计算机上运行命令。以下是 PsExec 尝试连接到域上每台计算机并运行hostname
命令的示例语法。
请注意,如果您在本地计算机是工作组的一部分时使用星号来查找域中的所有计算机,则会收到错误
A system error has occurred: 6118
。
使用通配符强制 PsExec 本质上运行net view /all
命令以首先查找域中的所有计算机。由于其依赖于 NetBIOS,这是查找计算机信息的过时方法。
从文件中读取
您可以一次在多台计算机上运行命令的另一种方法是使用文本文件。使用语法@<filename.txt>
,PsExec 将读取文本文件中的每一行,就好像它是一个计算机名称一样。然后它会分别处理每台计算机。
下面您可以看到使用 PowerShell 创建一个以行分隔的计算机名称文本文件,并将其用作 psexec 的输入的示例。
将本地程序复制到远程计算机
使用-c
开关,psexec将在执行之前将任何本地程序复制到远程计算机。
也许您的本地计算机上有一个在C:\Tools文件夹中的EXE文件,并且希望在远程计算机上运行它。您可以使用以下语法执行此操作:
当您使用-c
开关并且没有指定可执行文件时,PsExec仍将复制文件,但您将收到一个错误,指示系统找不到指定的文件。这是因为PsExec将始终尝试运行您复制的文件。
如果在使用PsExec之前需要将文件复制到远程计算机,请改用Copy-Item
PowerShell cmdlet。
在替代凭据下运行远程进程
PsExec的另一个常见用例是以替代帐户运行命令。默认情况下,PsExec将尝试使用当前登录的帐户连接到远程计算机。更具体地说,它将模拟您在远程计算机上的帐户。
使用-u
和可选的-p
开关允许您使用替代用户帐户连接到远程计算机。然后,PsExec将加密用户名和密码并将它们发送到远程计算机进行身份验证。
例如,如果您在一个工作组中,您将始终需要指定用户名以进行远程计算机的身份验证。
如果两台计算机都是Active Directory的成员,请确保在用户帐户之前加上域名。
请注意,当您不使用-u
开关时,psexec会模拟您在远程计算机上登录的帐户。它将无法访问任何网络资源。
以LOCAL SYSTEM帐户身份运行进程
在另一个帐户下运行PsExec最有用的功能之一是使用-s
开关。此开关允许PsExec(以及您远程执行的应用程序)在远程(或本地)计算机的LOCAL SYSTEM帐户下运行。
请注意,下面我没有包括远程计算机名称。PsExec同样愿意在本地计算机上运行。在这种情况下,我使用-s
选项告诉PsExec以LOCAL SYSTEM帐户身份启动本地命令提示符。

要在远程计算机上以LOCAL SYSTEM身份运行命令提示符,请像下面这样将计算机名称添加到引用中:
远程启动GUI应用程序
另一个有用的PsExec开关是-i
。默认情况下,PsExec不允许远程执行的命令在远程计算机上显示任何窗口。这很有帮助,因为如果您远程执行命令,您不会看到屏幕。
但也许您需要为用户打开程序。您个人不会使用该应用程序,但最终用户会。在这种情况下,请使用-i
开关。
也许您需要在远程计算机上打开记事本窗口。没问题。使用-i
开关运行notepad.exe,PsExec将打开记事本。

确保在启动交互窗口时也使用-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 支持交互使用,它将乐意返回一个闪烁的光标和提示符。

此时,世界是你的海洋。您可以通过这个“嵌套”命令提示符在本地计算机上运行命令,它们将在远程计算机上执行。
要退出命令提示符,请键入 exit
。PsExec 将停止远程计算机上的 cmd
进程,并将焦点返回到本地计算机。
不要使用 Ctrl-C 关闭交互式 cmd 会话。请始终使用
exit
。如果使用 Ctrl-C,psexec 会话将继续在远程计算机上运行。
远程安装软件
您可以将 PsExec 用作简陋的软件部署工具。也许您有一个 MSI 安装程序,需要在一个或多个名为 setup.msi 的远程计算机上运行。必须将此安装程序复制到远程计算机,然后使用 msiexec.exe 实用程序执行带有一些开关的命令。
以下是您如何使用 PsExec 远程部署软件的示例。此示例将 setup.msi 复制到远程计算机,然后以交互方式作为 SYSTEM 帐户启动 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,后者将愉快地处理每个计算机,就好像您手动键入了每个计算机名称一样。
你可以在下面看到使用 Get-AdComputer
cmdlet 的示例,它是 ActiveDirectory PowerShell 模块 的一部分。
远程启用 PowerShell Remoting
如果你有远程计算机,而不想使用 PsExec 而是想使用 PowerShell Remoting,你可以使用 PsExec 来启用它们。
通过在远程计算机上运行 Enable-PSRemoting
或 winrm.cmd 批处理文件,你可以快速在多台计算机上启用 PowerShell Remoting。
下面是在以 SYSTEM 帐户运行的远程计算机上调用 winrm.cmd 批处理文件的示例。由于不需要该命令的输出,它被使用 2>&1> $null
静音。
PsExec 错误消息
值得再次提前提到的是,你从 PsExec 返回的大多数错误代码来自远程过程,而不是来自 PsExec。但了解这些错误代码及其可能含义是有帮助的。
如果你想要查看所有 Windows 错误代码的参考,请查看这个详尽的 Windows 错误代码列表。
以下是你可能从 PsExec 返回的常见错误代码列表。
Error Code | Explanation |
---|---|
-2146232576 | Typically returned by Windows Update when an error occurs. |
0 | Command executed successfully |
1 | Incorrect function. A problem happened. That’s about it. |
1603 | Fatal error during installation. This typically is returned by msiexec. |
2 | The system cannot find the file specified |
4 | The system cannot open the file. |
5 | Access is denied. |
6 | The handle is invalid. |
6118 | The list of servers for this workgroup is not currently available |
您的反馈
ATA终极指南非常全面。这些内容丰富,难免会有遗漏或错误。如果您发现任何错误或认为应该添加内容到本指南中,请通过评论告诉我。我将很乐意在帖子中为您署名。
鸣谢
- 感谢Mathias(评论)提供的大量反馈。