如果有一個命令行工具可以與robocopy在實用性上競爭,那就是PsExec。Sysinternals PsExec工具在IT管理員的工具箱中無處不在。這個工具允許管理員遠程運行命令,就像他們在本地計算機上一樣。
為了深入介紹PsExec工具,有必要在ATA Ultimate Guide中介紹這個令人垂涎的工具。在這個指南中,您將學習什麼是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腳本來測試您的遠程計算機。
- 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
cmdlet來完成。
如果您不想逐台訪問每台電腦,並且您在Active Directory域中有PowerShell Remoting可用,您還可以使用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 帳戶執行進程
在使用 an alternative account 執行 PsExec 的最有用的功能之一是使用 -s
開關。該開關允許 PsExec(和您遠端執行的應用程序)在遠端(或本地)電腦的 LOCAL SYSTEM 帳戶下執行。
請注意,下面我沒有包含遠端電腦名稱。PsExec 也可以在本地電腦上運行。在這個例子中,我使用 -s
選項告訴 PsExec 以 LOCAL SYSTEM 帳戶身份啟動本地命令提示符。

要在遠端電腦上以 LOCAL SYSTEM 身份執行命令提示符,將電腦名稱添加到參考中,如下所示:
遠程啟動 GUI 應用程序
另一個有用的 PsExec 開關是 -i
。默認情況下,PsExec 不允許遠程執行的命令在遠端電腦上彈出任何窗口。這很有幫助,因為如果您遠程執行命令,您不會看到屏幕。
但是也許您需要為用戶打開程序。您個人不會使用該應用程序,但最終用戶會使用。在這種情況下,使用 -i
開關。
也許您需要在遠端電腦上打開記事本窗口。沒問題。運行 notepad.exe 並加上 -i
開關,PsExec 將打開記事本。

但請確保在打開互動視窗時也使用-d
開關進行斷開連接。預設情況下,PsExec 將等待其執行的進程完成。如果保持遠程進程(在本例中為記事本)運行,PsExec 將永遠不會返回控制權。
使用-d
開關和-i
將告訴 PsExec 不等待遠程進程完成。相反,它會在遠程進程執行後立即斷開連接並返回控制權給您。
重定向輸出
PsExec 將依賴遠程進程發送到本地會話的任何輸出。通常,此輸出將直接發送到本地控制台。但如果您想要重定向它,可以使用通常的重定向運算符進行操作。
例如,如果您想運行一個命令並將所有輸出靜音,可以將輸出和錯誤重定向到 null 使用^> nul 2^&1
。
請注意特殊字符使用插入符號進行轉義(
^
)。
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的示例,该cmdlet是ActiveDirectoryPowerShell模块的一部分。
远程启用PowerShell Remoting
如果您有远程计算机,而不是使用PsExec,您可以使用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 (評論) 提供的許多反饋。