Windows 遠程管理 (WinRM) 是 WS-Management 協議的 Microsoft 實現。該協議是基於簡單對象訪問協議 (SOAP) 的、防火墻友好的標準協議,使來自不同供應商的硬件和操作系統能夠互操作。WS-Management 協議由硬件和軟件制造商群體開發,作為一種公共標準,可用於與實現該協議的任何計算機設備遠程交換管理數據。
使用PowerShell對服務器遠程管理,要在遠程服務器上啟用WinRM。
一、知識儲備:
1、WinRM相關操作
開啟WinRM服務:
Enable-PSRemoting –Force
阻止本地計算機接收遠程命令(不會停止WinRM服務):
Disable-psremoting –Force
查看WinRM服務監聽信息:
winrm enumerate winrm/config/Listener
WinRM2.0默認端口5985(HTTP端口)或5986(HTTPS端口)。
刪除WinRM HTTP偵聽:
winrm delete winrm/config/listener?Address=*+Transport=HTTP
重新建立HTTP偵聽:
winrm create winrm/config/listener?Address=*+Transport=HTTP
WinRM服務更改監聽端口:
set-item -force wsman:\localhost\listener\listener*\port 5985
查看WinRM的配置:
winrm get winrm/config
查看端口監聽狀態:
netstat -nao | findstr "5985"
2、PowerShell腳本保存憑據方法
使用Get-Credential命令來交互式輸入憑據(用戶名+密碼),可以先將憑據保存到一個變量中,如:
$cred = get-credential
$cred的對象類型名稱為:system.Management.Automation.PSCredential,其中的Password和UserName都是其屬性,所以可以新建一個該類型的對象。在此處需要註意的是Password類型為SecureString,UserName類型為String,所以需要將明文的Password轉換為安全字符串,可以使用ConvertTo-SecureString命令。
非交互式保存憑據代碼示例:
$account = "administrator" $password = '123456' $secpwd = convertto-securestring $password -asplaintext -force $cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd
3、Invoke-command
Invoke-Command在本地和遠程計算機上運行命令,並從命令返回所有輸出,包括錯誤。使用一個Invoke-Command命令,可以在多臺計算機上運行命令。部分參數介紹:
-Port <int>
指定遠程計算機上用於此命令的網絡端口。用於WinRM默認監聽端口被更改的情況下,指定新的端口。
-ComputerName <string[]>
指定運行此命令的計算機。默認值為本地計算機。
使用 ComputerName 參數時,Windows PowerShell 會創建一個臨時連接,此連接僅用於運行指定的命令,之後將關閉。如果需要持續性連接,請使用 Session 參數。
在一個逗號分隔列表中鍵入一臺或多臺計算機的 NETBIOS 名稱、IP 地址或完全限定的域名。要指定本地計算機,請鍵入計算機名稱、“localhost”或句點 (.)。
若要在 ComputerName 參數的值中使用 IP 地址,命令必須包括 Credential 參數。另外,必須為計算機配置 HTTPS 傳輸,或者必須在本地計算機上的 WinRM TrustedHosts 列表中包含遠程計算機的 IP 地址。
-Session <PSSession[]>
在指定的 Windows PowerShell 會話 (PSSession) 中運行此命令。
通過創建 PSSession,Windows PowerShell 可以建立與遠程計算機的持續性連接。
-Credential <PSCredential>
指定有權執行此操作的用戶帳戶。默認值為當前用戶。
-command/-ScriptBlock <scriptblock>
指定要運行的命令。用大括號 ({ }) 括起命令以形成腳本塊。
-FilePath <string>
在一臺或多臺遠程計算機上運行指定的本地腳本。
-AsJob
在遠程計算機上將命令作為後臺作業運行。使用此參數可運行需要較長時間才能完成的命令。
使用 AsJob 時,此命令返回代表作業的對象,然後顯示命令提示符。要管理作業,請使用 Job cmdlet。要獲取作業結果,請使用 Receive-Job。
-ThrottleLimit <int>
指定為運行此命令可建立的並發連接的最大數目。如果省略此參數或輸入 0 值,則使用默認值 32。
4、PSSession
PSSession即Windows PowerShell會話。當你需要與遠程計算機的持續連接時,則使用PSSession。PSSession相關命令:
Enter-PSSession
啟動與遠程計算機間的交互式會話。
New-PSSession
創建PSSession,並返回一個表示PSSession的對象。你可以將對象保存在變量中。
Get-PSSession
獲取當前會話中創建的PSSession。Get-PSSession返回與New-PSSession返回的對象相同類型的對象。
Remove-PSSession
刪除 PSSession 並釋放其正在使用的資源。
5、將計算機名稱添加到TrustedHosts列表
若要將所有計算機添加到受信任主機列表,請使用以下命令 :
set-item wsman:localhost\client\trustedhosts -Force -value *
還可以使用通配符 (*) 將特定域中的所有計算機添加到受信任主機列表。
例如,以下命令將Fabrikam域中的所有計算機添加到受信任主機列表。
set-item wsman:localhost\client\trustedhosts *.fabrikam.com
若要將特定計算機的 IP 地址添加到受信任主機列表,請使用以下命令格式(IP支持通配符*):
set-item wsman:\localhost\Client\TrustedHosts -value "<IP Address>[,<IP Address>]"
若要查看受信任主機列表,請使用以下命令:
get-item wsman:\localhost\Client\TrustedHosts
二、遠程操作常見場景
場景一:遠程交互式會話
這個場景一般用於手動進行遠程操作,輸入命令,查看結果。方法很簡單。進入交互式會話的命令是Enter-PSSession,退出時鍵入Exit-PSSession或者exit都可以。遠程交互式操作期間,輸入的命令在遠程計算機上運行,就像直接在遠程計算機上輸入並執行這些命令一樣。期間所定義的變量和命令的執行結果在退出交互式會話之後不再可用。
場景一例子: # 用戶輸入憑據(用戶名+密碼) $cred=get-Credential # 建立遠程交互式會話 Enter-PSSession -computername 192.168.21.1 -Credential $cred
場景二:腳本塊、腳本文件的一次性執行
這種場景,是在本地計算機與遠程計算機上建立一個臨時會話。將腳本塊或者腳本文件的內容發送到遠程計算機執行,並將結果發回本地計算機。這種方法執行效率很高,是PowerShell推薦的執行遠程命令的方法。除非需要在會話中共享數據,否則建議使用該方法。
場景二例子、 # 用戶輸入憑據(用戶名+密碼) $cred=get-Credential # 遠程執行命令 invoke-command -computername 192.168.21.1 -Credential $cred -command {dir C:/} invoke-command -computername 192.168.21.1 -Credential $cred -ScriptBlock {dir c:\} # 遠程執行腳本 echo "dir c:\" > dirDriveC.ps1 invoke-command -computername 192.168.21.1 -Credential $cred -FilePath .\dirDriveC.ps1
場景二例子(多個遠程主機)、 # 用戶輸入憑據(用戶名+密碼) $cred=get-Credential # 對多個遠程主機批量執行命令 invoke-command -computername 192.168.21.1,192.168.21.4,192.168.21.7 -Credential $cred -ScriptBlock {dir c:\} # 設置並發連接數設置為1的情況 invoke-command -computername 192.168.21.1,192.168.21.4,192.168.21.7 -Credential $cred -ThrottleLimit 1 -ScriptBlock {dir c:\}
場景三:腳本塊、腳本文件在命名會話中執行
1、定義會話: 請使用new-pssession命令定義會話,如$session1 = new-pssession -computername server1。(如果必要請使用Credential參數。)
2、在會話中遠程執行腳本(或者腳本文件): 請使用Invoke-Command命令執行遠程腳本,如Invoke-Command -Session $session1 -ScriptBlock {dir c:\}或者Invoke-Command -Session $session1 -FilePath .\dirDriveC.ps1
3、獲得結果: 可以將執行結果賦於變量,如$sub = Invoke-Command -Session $session1 -ScriptBlock {dir c:\}或者$sub = Invoke-Command -Session $session1 -FilePath .\dirDriveC.ps1
後續命令可參照步驟2或者3繼續執行,所有執行的命令就好像在同一個上下文中執行一樣。
場景三例子、 # 用戶輸入憑據(用戶名+密碼) $cred=get-Credential # 創建PSSession,並賦值給變量 $session1 = new-pssession -computername 192.168.21.1 -Credential $cred # 遠程執行命令(持續性) Invoke-Command -Session $session1 -ScriptBlock {$a="hello world"} Invoke-Command -Session $session1 -ScriptBlock {$a}
場景三例子(多個遠程主機)、 # 用戶輸入憑據(用戶名+密碼) $cred=get-Credential # 對多個遠程主機創建PSSession,並賦值給變量 $session_many = new-pssession -computername 192.168.21.1,192.168.21.4,192.168.21.7 -Credential $cred # 對多個遠程主機批量執行命令 Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock {dir c:\}
場景三例子(腳本方式)、 $account = "administrator" $password = '123456' # 把密碼轉換為SecureString $secpwd = convertto-securestring $password -asplaintext -force # 新建PSCredential對象 $cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd # 遠程主機列表賦值給變量 [string[]]$computername="192.168.21.1","192.168.21.4","192.168.21.7" # 創建PSSession $session_many = new-pssession -computername $computername -Credential $cred # 批量遠程執行命令 Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock {dir c:\}
參考資料:
https://technet.microsoft.com/zh-cn/library/dd347578.aspx
https://technet.microsoft.com/zh-cn/library/hh847839.aspx
https://technet.microsoft.com/zh-cn/library/dd347642.aspx
http://www.cnblogs.com/ceachy/archive/2013/02/20/PowerShell_Remoting.html
本文出自 “啟程的linux博客” 博客,請務必保留此出處http://qicheng0211.blog.51cto.com/3958621/1926913
Tags: localhost listener Microsoft Windows windows
文章來源: