PowerShell 遠程執行命令
最近在做一些自動化的測試工作,在代碼實現的過程中需要遠程啟動/關閉一些服務或者測試機。
我首先想到的是建立一個website,通過網站對一些服務進行操作,但是這樣感覺比較重,而且重啟一些例如IIS或者計算機的時候不是很安全。還有一種方式就是執行ssh命令或者bat命令。由於服務器是windows的,我就考慮是否可以使用PowerShell來實現。
工具
微軟提供了一個一個叫WS-Management的協議,可以實現設備遠程交換數據的方法。本身自帶了一個叫 (Windows Remote Management service,簡稱 WinRM) 的服務。我們可以通過PowerShell來實現遠程控制。
Host:
在host機器上我們首先檢查下WinRM服務是否安裝成功:
Get-Service WinRM
該服務默認情況下是開啟的,如果沒有開啟可以到services列表里面進行開啟,或者在powershell里面開啟:
Enable-PSRemoting –Force
這個時候如果你的客戶端和服務端的計算機都在工作域中,那么這時候的配置基本上是可以使用了。 如果不在域里面,則還需要做以下額外的操作:
Client:
在Client端執行以下命令, 將服務器機器添加到信任列表里:
Set-Item wsman:\localhost\client\trustedhosts *
Restart-Service WinRM
測試以下,服務通訊是否成功:
Test-WsMan xxx.xxx.xxx.xxx
看到類似上面的信息,就表示兩個計算機之間的通訊是通暢的。
如果出現以下錯誤:
根據提示去server端運行 winrm quickconfig,然后一路默認即可:
然后我們就可以嘗試使用命令遠程連接計算機了:
Enter-PSSession -ComputerName 10.112.20.84 -Credential administrator
在彈出的登錄框中輸入host的密碼就可以登錄遠程計算機了:
但是這種方式需要手工輸入密碼,不是很方便,我們只需要將這些用戶名密碼參數化就可以實驗腳本化登錄了:
$Username = '*********' $PWD = '********' $pass = ConvertTo-SecureString -AsPlainText $PWD -Force $Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass Invoke-Command -ComputerName 10.112.20.84 -ScriptBlock { iisreset } -credential $Cred