標籤:winrm powershell invoke-command
Windows 遠端管理 (WinRM) 是 WS-Management 通訊協定的 Microsoft 實現。該協議是基於簡易物件存取通訊協定 (SOAP) (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"
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M02/96/19/wKioL1kdBBzCxE20AAGJt42HbX0069.png-wh_500x0-wm_3-wmp_4-s_2958921877.png" title="1.png" alt="wKioL1kdBBzCxE20AAGJt42HbX0069.png-wh_50" />
2、PowerShell指令碼儲存憑據方法
使用Get-Credential命令來互動式輸入憑據(使用者名稱+密碼),可以先將憑據儲存到一個變數中,如:
$cred = get-credential
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/96/19/wKioL1kdBCjSkN7xAABGBTheQDA354.png-wh_500x0-wm_3-wmp_4-s_439647423.png" title="2.png" alt="wKioL1kdBCjSkN7xAABGBTheQDA354.png-wh_50" />
$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
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M00/96/19/wKioL1kdBDbBLJikAABZOEO_R5Q583.png-wh_500x0-wm_3-wmp_4-s_3331756484.png" title="3.png" alt="wKioL1kdBDbBLJikAABZOEO_R5Q583.png-wh_50" />
二、遠程操作常見情境
情境一:遠程互動式會話
這個情境一般用於手動進行遠程操作,輸入命令,查看結果。方法很簡單。進入互動式會話的命令是Enter-PSSession,退出時鍵入Exit-PSSession或者exit都可以。遠程互動式操作期間,輸入的命令在遠端電腦上運行,就像直接在遠端電腦上輸入並執行這些命令一樣。期間所定義的變數和命令的執行結果在退出互動式會話之後不再可用。
情境一例子:# 使用者輸入憑據(使用者名稱+密碼)$cred=get-Credential# 建立遠程互動式會話Enter-PSSession -computername 192.168.21.1 -Credential $cred
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/96/19/wKiom1kdBF-zRbLbAAApoTzX7cE469.png-wh_500x0-wm_3-wmp_4-s_654629191.png" title="4.png" alt="wKiom1kdBF-zRbLbAAApoTzX7cE469.png-wh_50" />
情境二:指令碼塊、指令檔的一次性執行
這種情境,是在本機電腦與遠端電腦上建立一個臨時會話。將指令碼塊或者指令檔的內容發送到遠端電腦執行,並將結果發回本機電腦。這種方法執行效率很高,是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.ps1invoke-command -computername 192.168.21.1 -Credential $cred -FilePath .\dirDriveC.ps1
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/96/19/wKioL1kdBEOgG1zGAAAlVesM1jw732.png-wh_500x0-wm_3-wmp_4-s_400029066.png" title="5.png" alt="wKioL1kdBEOgG1zGAAAlVesM1jw732.png-wh_50" />
情境二例子(多個遠程主機)、# 使用者輸入憑據(使用者名稱+密碼)$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}
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M00/96/19/wKioL1kdBGzz--vqAAB_7WeKz-4673.png-wh_500x0-wm_3-wmp_4-s_261082102.png" title="6.png" alt="wKioL1kdBGzz--vqAAB_7WeKz-4673.png-wh_50" />
情境三例子(多個遠程主機)、# 使用者輸入憑據(使用者名稱+密碼)$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
windows伺服器遠程執行命令(PowerShell+WinRM)