如何在遠程系統上終止Windows進程

也许你正在愉快地在远程Windows服务器上工作,突然发现一个进程出现问题,占用了宝贵的CPU资源。你该怎么办?终止它!

在本教程中,你将学习如何使用本机工具、第三方工具和PowerShell来终止Windows进程。首先,你将学习如何检查Windows中正在运行的进程,然后终止这些进程。

先决条件

如果你想按照本教程的步骤进行操作,请确保提前准备以下内容:

  • A Windows PC – All demos in this tutorial will use Windows 10, but Windows 7+ will work also.
  • A Windows Server or another Windows desktop to use as your target for killing the remote tasks. This tutorial uses a standalone Windows Server 2016 as the remote server.
  • 来自Microsoft的Sysinternals套件
  • Windows PowerShell 5或更高版本。本教程使用的是PowerShell v7.1.3

使用Tasklist查询远程Windows进程

自Windows XP以来,就有一个有用的工具叫做tasklist。Tasklist是一个方便的工具,可以查询远程计算机上的进程。在终止一个进程之前,你必须先找到它们!

在桌面上打开一个PowerShell会话或命令提示符,并输入以下命令以显示远程计算机上所有正在运行的进程。

下面的命令查询一个远程计算机(/S),使用管理员用户名(/U)和密码(/P)进行身份验证。

tasklist /S WIN-BANGJIEFNOC.local.net /U administrator /P password

您會注意到下面的會話名稱未顯示出來。由於您在遠程計算機上運行tasklisttasklist不會提供會話名稱

list of processes on a remote server

也許您只想列出單個進程,這沒問題。要做到這一點,請指定/FI參數。/FI參數接受一個查詢,該查詢將傳遞給tasklist以過濾特定進程。

tasklist /S WIN-BANGJIEFNOC.local.net /fi "imagename eq notepad.exe" /U administrator /P 'password'
The output of tasklist showing a specific process

使用PSList查詢遠程Windows進程

另一個查看運行進程的工具是PSList,這個實用程序是Sysinternals Suite的一部分。這套工具組已經存在多年,由Azure的CTO Mark Russinovich創建!

讓我們開始介紹如何查看遠程計算機上的運行進程。

1. 在您的桌面上打開PowerShell會話或命令提示符,並將目錄更改為您提取Sysinternal Suite的位置。

2. 在PowerShell會話中運行以下命令,以實時顯示遠程計算機上運行的進程和相關CPU使用情況。

下面的命令运行pslist来查询在WIN-BANGJIEFNOC计算机上认证为Administrator用户名(-u)和密码(-p)的所有远程Windows进程。

该命令使用-s开关将pslist转换为“任务管理器模式”,可以重复更新列表。

如果这是您首次使用Sysinternals工具,可能会出现一个要求您接受EULA的横幅;点击“确定”。

.\pslist \\WIN-BANGJIEFNOC.local.net -u Administrator -p 'password' -s

现在您会看到从运行该命令后的以下输出;本文只关心其中的3个值。如下所示。

  • 名称:进程的名称。
  • Pid:进程标识符,在本教程中使用的一个关键值,PID号可以用于终止远程进程。它是分配给一个进程的数字ID。
  • CPU:这显示了您整体可用CPU的实时利用率。

其他值与内存有关,超出了本文的范围。

Output in real-time of pslist

3. 由于第二步使用了-s开关,按Ctrl-C退出pslist返回到控制台。

通过使用-e开关后跟进程名称来缩小返回的进程列表,例如-e Winlogon

使用PSKill按進程名稱終止進程

一旦您知道如何查找遠程進程,現在讓我們深入了解如何終止它們。首先,讓我們介紹一下pskill 實用程序。首先,學習如何按進程名稱終止進程。

1. 確保您在遠程服務器上有一個可以終止的進程。本教程將使用記事本進程。

2. 在本地桌面上打開PowerShell會話或命令提示符,將目錄更改為您提取Sysinternal套件的位置,然後運行以下命令。您可以看到pskill的語法與pslist類似。

.\pskill.Exe \\WIN-BANGJIEFNOC.local.net -u administrator -p 'password' -e notepad.exe
Output of pskill

3. 現在,運行pslist,如前一節所述,以確認進程確實已停止。

.\pslist \\WIN-BANGJIEFNOC.local.net -u Administrator -p 'password' -e notepad.exe
Output of pslist

使用PSKill按進程ID終止進程

如果只運行一個特定進程的單個實例,或者您想終止所有具有相同名稱的進程,則按名稱終止進程可能已經足夠。那麼,如果您要終止運行中的特定進程實例呢?以下步驟將演示這一點。

1. 在遠程服務器上打開記事本兩次;在此演示中,您將終止其中一個進程;當然,您也可以替換其他進程。

2. 執行以下命令,注意下面顯示的其中一個Pid;您需要這個值進行下一步操作。

.\pslist \\WIN-BANGJIEFNOC.local.net -u Administrator -p password -e notepad
Using pslist to list PID’s of Notepad

3. 使用PID,现在运行pskill,将PID作为最后一个参数提供。

.\pskill.Exe \\WIN-BANGJIEFNOC.local.net -u administrator -p password 1984
The output of pskill for a particular PID

4. 最后,通过重新运行pslist检查是否仍有一个Notepad实例正在运行。现在您应该只能看到一个Notepad实例正在运行。

Output of pslist

使用TaskKill按名称结束远程Windows进程

taskkill实用程序是Windows的本机工具,还包括根据用户名和应用程序名称重新启动进程的其他命令行选项。让我们开始并再次结束Notepad!

按名称结束进程

1. 在远程服务器上打开Notepad;在本演示中,您将结束的进程是Notepad;当然,您也可以替换为其他进程。

2. 在桌面上打开PowerShell会话或命令提示符。键入以下命令将结束notepad.exe

taskkill /S WIN-BANGJIEFNOC.local.net /you administrator /p password /IM notepad.exe

输出如下:

/IM是Image的参数;在本例中是notepad.exe

The output of taskkill command

3. 要确认进程已停止,运行tasklist。现在您应该看不到任何与该筛选器匹配的任务。

tasklist /S WIN-BANGJIEFNOC.local.net /fi "imagename eq notepad.exe" /U administrator /P 'password'
Output of tasklist using imagename

使用TaskKill按PID结束远程Windows进程

使用PID结束进程与使用进程名称并没有太大区别。但是,由于您无法使用名称,您首先需要找到PID,然后将其传递给taskkill

假设您在远程Windows主机上运行Notepad:

1. 執行以下命令tasklist以查找記事本進程的PID。注意其中一個PID,您需要它進行下一步操作。

tasklist /S WIN-BANGJIEFNOC.local.net /fi "imagename eq notepad.exe" /U administrator /P 'password'
the output of tasklist to view PIDS

2. 現在,執行taskkill,並將PID作為最後一個參數提供。

taskkill /S WIN-BANGJIEFNOC.local.net /u administrator /p 'password' /PID 3776
The output of taskkill specifying a particular PID

3. 最後,執行tasklist來確認進程已停止。

Output of tasklist

使用PowerShell在遠程Windows系統中終止進程

PowerShell為您提供了幾種終止遠程進程的選項;第一個cmdletStop-Process無法原生地終止遠程進程,因為它沒有選項來指定計算機名稱。但是,您可以通過遠程運行Stop-Process來解決此問題,使用PowerShell遠程管理

1. 如果您的主機和遠程服務器不在Active Directory域中,首先提供用戶名和密碼,創建PSCredential對象。

$credentials = Get-Credential
Setting up credentials

2. 接下來,由於教學將使用 SSL 連接到遠程計算機並使用自簽名憑證,請創建一個 PSSessionOption,以跳過對受信任的憑證機構進行檢查。

$PSSessionOption = New-PSSessionOption -SkipCACheck

3. 現在,使用 Enter-PSSession 命令連接到服務器,該命令建立了與遠程服務器的交互會話。

以下命令將使用上面提供的用戶名和密碼(Credential),跳過憑證機構檢查(SessionOption),並通過 SSL 連接到 WIN-BANGJIEFNOC.local.net 計算機。

Enter-PSSession -ComputerName WIN-BANGJIEFNOC.local.net -Credential $credentials -SessionOption $PSSessionOption -UseSSL
Using Enter-PsSession for an interactive session

4. 連接到遠程主機後,運行 Get-Process 命令檢查要終止的進程。在這種情況下,您將看到 notepad 進程。

Get-Process -ProcessName Notepad
Output of Get-Process

5. 要終止此進程,請運行下面的 Stop-Process

Stop-Process -ProcessName Notepad

6. 最後,通過重新運行 Get-Process 確認您已經終止了該進程,您應該會收到一個錯誤消息。

Checking for Notepad as a running process

如果您想非交互方式停止遠程的 Windows 進程,請使用 Invoke-Command 命令 並使用以下參數:Invoke-Command -ComputerName WIN-BANGJIEFNOC.local.net -Credential $credentials -ScriptBlock {Stop-Process -ProcessName notepad} -UseSSL。將 Stop-Proces 命令封裝在 ScriptBlock 參數內,將該命令發送到遠程主機。

結論

你已经学习了不同的杀死远程进程的方法,以及如何克服网络防火墙规则可能导致工具无法正常工作的情况;这个教程可能还帮助你修复了Windows。

你学到的工具是强大的工具,请谨慎使用!

Source:
https://adamtheautomator.com/how-to-kill-a-windows-process/