使用 PowerShell 遠端處理執行命令
使用 Windows PowerShell,有多種方法可以在本地或遠端計算機上執行命令。一種方法是啟用 PowerShell 遠端處理並使用 PowerShell 會話命令。
本文將討論 PowerShell 遠端處理的工作原理、配置 WinRM、幾個 PowerShell 會話命令示例,以及我們如何遠端訪問具有管理員訪問許可權的計算機。
什麼是 PowerShell 遠端處理
PowerShell Remoting(或 PSRemoting)是 PowerShell 中常用的功能之一。因此,我們可以無縫連線到一臺或多臺遠端計算機並使用單個命令執行命令。
簡而言之,PSRemoting 允許我們在遠端計算機上執行命令,就像我們坐在它們面前一樣。此外,PSRemoting 提供連線和驗證使用者、執行遠端 cmdlet 並將該 cmdlet 的任何輸出顯示到本地計算機的功能。
將 PSRemoting 想象成 SSH 或 telnet 甚至 psexec。它只是在 PowerShell 中的計算機上執行命令的一種方式。
PSRemoting 嚴重依賴會話中執行的命令。會話是在內部執行命令的遠端 shell。
建立這些會話之一需要在 PowerShell 控制檯的後臺執行許多步驟。
當我們啟動 PSRemoting 會話時,會執行以下粗略步驟:
-
使用者嘗試在
WinRM偵聽器上連線到目標伺服器。WinRM偵聽器是在伺服器上執行的小型 Web 服務。WinRM是稱為WSMan的實施標準的 Microsoft 版本。WSMan是當時由許多其他大型科技公司建立的開源標準,如英特爾、戴爾和 Sun Microsystems。 -
當客戶端通過 HTTP 或 HTTPS 協議連線到偵聽器時,身份驗證過程開始。
-
客戶端連線並驗證伺服器後,
PSRemoting生成會話。 -
PSRemoting生成會話後,它就開始營業了。客戶端可以開始向伺服器傳送資訊,返回任何必要的輸出,稱為序列化。這種通訊通常是加密的。
要啟用 PSRemoting,請在你的 PowerShell 控制檯中鍵入以下命令。
Enable-PSRemoting –Force
在 PowerShell 中配置 WinRM 偵聽器
客戶端需要在某個地方通過網路進行連線。客戶需要與對方傾聽的東西交談; 監聽部分是 WinRM 監聽器的角色。
你可以使用下面的 winrm 命令發現在任何 Windows 計算機上執行的所有 WinRM 偵聽器。
winrm e winrm/config/listener
WinRM 偵聽器有一些基本元件。
- 監聽地址——他們繫結的 IP 地址。監聽地址是客戶端連線的伺服器 IP 地址。
- 傳輸型別——每個
WinRM偵聽器都需要一種與客戶端通訊的方式;他們通過使用 HTTP 或 HTTPS 的傳輸來做到這一點。 - 可選證書指紋——如果
WinRM偵聽器使用 HTTPS 進行傳輸,它必須知道驗證客戶端的私鑰是什麼;此金鑰是使用證書指紋找到的。
要將遠端計算機新增到 WinRM 中本地計算機的受信任主機列表中,請在下面鍵入以下命令。
winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'
要驗證和檢查 WinRM 的配置,請在下面鍵入以下命令。
winrm quickconfig
建立新的 PowerShell 會話
New-PSSession 命令在本地或遠端計算機上建立 Windows PowerShell 會話 (PSSession)。建立 PSSession 時,PowerShell 會與遠端計算機建立持久連線。
我們可以在遠端計算機上執行命令,而無需使用 Enter-PSSession 或 Invoke-Command 的–ComputerName 引數建立 PSSession。
當你使用 –ComputerName 引數時,PowerShell 會建立一個用於 cmdlet 的臨時連線,然後關閉。
從 Windows PowerShell 6.0 開始,如果在本地計算機上啟用了 SSH,並且遠端計算機配置了 Windows PowerShell SSH 端點,我們可以使用安全 shell (SSH) 在遠端計算機上建立和建立會話。
基於 SSH 的 Windows PowerShell 遠端啟動會話的好處之一是它可以跨多個平臺(Windows、Linux、macOS)或跨平臺工作。
對於基於 SSH 的會話,我們可以使用 -HostName 或 -SSHConnection 引數來指定遠端計算機和其他相關連線資訊。
New-PSSession -ComputerName DC01 -Credential (Get-Credential)
請記住,New-PSSession 命令生成的會話是持久的。這意味著我們可以多次使用它。
但是,我們必須記住,我們應該在使用 Remove-PSSession 命令後關閉會話以避免安全風險。
在 PowerShell 中使用呼叫方法遠端執行快速命令
如果我們現在編寫執行的命令,最好使用 Invoke-Command cmdlet,因為我們在 IDE 中保留了 IntelliSense。此外,如果我們執行快速、簡單、一次性使用的命令,Invoke-Command 是有利的。
任何 Invoke 方法的會話都是非持久的,不會保留任何惡意使用者可以濫用的會話。
下面的片段是 Invoke-Command 的示例,它傳遞使用者名稱和安全字串密碼,可以在管理員級別執行命令。
指令碼示例:
$username = "Username"
$password = "Password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = New-Object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
Invoke-Command -ComputerName RemoteServer -ScriptBlock {Get-Process } -Credential $cred
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn