做者: 付海軍
出處:http://fuhj02.blog.51cto.comhtml
PowerShell 2.0的遠程管理功能很強大,爲了方便讀者學習這裏首先介紹學習環境的設置,便於讀者在理解原理的同時有相對形象的體驗。在本文中,將會分別介紹瞭如何啓用和禁用powershell的遠程管理,以及如何在工做組和混合域環境下配置計算機。以及如何使用Invoke-Command cmdlet用於在遠程主機上執行命令,建立持久線程,在多個命令間同一線程傳遞的變量和參數。用戶還能夠在執行較費時的命令時之後臺任務的形式實現,並在執行完畢後使用命令回調執行結果。shell
1 啓用和禁用遠程管理
PowerShell 2.0中能經過在PowerShell提示符下執行下列的cmdlet啓用遠程管理
PS C:\> Enable-PSRemoting
該cmdlet會向用戶詢問幾個問題以下圖1所示
當執行該cmdlet時執行了如下操做,其中包括:
1. 啓動或從新啓動(若是已啓動) WinRM 服務。
2. 將 WinRM 服務類型設置爲自動啓動。
3. 在本地計算機上建立一個偵聽器以接受任意 IP 地址上的請求。
4. 對 WS-Management 流量啓用防火牆例外(僅適用於 http),若是要啓用PS遠程管理,此時網絡位置不能被設置爲public,由於Windows 防火牆例外不能在網絡位置是public時被啓用。
5.啓用全部註冊的PS線程配置信息。
默認狀況下,WinRM只啓用http傳輸用於接收遠程請求。用戶可使用winrm命令或New-WSManIntance cmdlet手動啓用https傳輸。
【提示】
默認狀況下,PowerShell遠程管理使用5985(http)和5986(https)端口。能夠經過使用Set-Item cmdlet修改wsman:\Localhost\listener\listener*\port對端口號進行設置,須要注意的是這樣的操做將會改變系統中每一個WinRM監聽器端口號。
當給Enable-PSRemoting cmdlet增長-force參數後執行將會在靜默狀態下啓用遠程管理,PowerShell遠程管理是不能經過遠程啓用的。
1.1 測試PowerShell遠程管理
若是遠程管理被啓用了,可使用下面的cmdlet查看:
PS C:\ > Enter-PSSession –ComputerName localhost
用戶將會看到以下圖2所示的提示符:
【提示】
PowerShell線程(PS Session)是運行遠程命令和腳本的環境。PowerShell 2.0提供了各式各樣的cmdlet管理這些線程。可使用Get-Command –noun PSSession命令查看全部與PSSession相關的cmdlet。
能夠用New-PSSesssionOption改變PS線程默認的表現。New-PSSession和Enter-PSSession有一個參數-sessionOption用於指定自定義線程選項,備選的選項有:
IdleTimeOut
定義遠程主機的過時時間,在未收到本地計算機包括心跳信號在內的任何通訊數據的狀況下,PSSession將會被關閉
OpenTimeOut
定義客戶端主機等待線程創建鏈接的超時時間,一旦超時,創建鏈接的命令將會失敗。
OperationTimeOut
定義能在PSSession中運行任何操做的最長時間,一旦超時,操做將會失敗。
SkipCACheck
指定在經過HTTPS鏈接時,客戶端不驗證服務器證書是否由受信的CA簽發
SkipCNCheck
指定服務器的證書普通名(CN,Common Name)不須要匹配服務器的主機名,這個選項只是用於經過HTTPS協議傳輸的遠程操做。
SkipRevocationCheck
不驗證主機證書的撤回狀態。
1.2在工做組環境中遠程管理
只經過運行Enable-PSRemoting cmdlet是直接沒法鏈接到工做組中的計算機的。本質上來講是由於加入工做組的計算機所擁有的安全級別是比加入域中的計算機更嚴格。因此若是再加入工做組中的計算機,用戶在建立遠程線程以前須要啓用相關的設置。
Windows XP
用戶須要確認將本地安全策略設置爲網絡登陸經典鑑權。經過控制面板→管理工具→本地安全策略,定位到「本地策略」→「安全選項」雙擊「網絡訪問:本地賬戶的共享和安全模式」,並設置爲「經典-本地用戶以本身的身份驗證」,效果以下圖3所示:
修改WSMan信任主機設置
在全部加入工做組的計算機——包括Windows XP,Windows Vista或更高版本,用戶須要使用以下命令增長全部遠程客戶端的IP地址到受信主機清單中:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value *
使用*用於將全部主機添加爲受信主機,若是須要指定特定的主機可使用下面的命令:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value Copmuter1,Computer2
若是須要添加指定域名下的全部主機可執行下面的命令:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value *.testdomain.com
若是須要添加遠程主機的IP地址到受信主機的清單:
PS C:\ > Set-item wsman:localhost\client\trustedhosts –value 10.0.0.1
一旦作了上面的更改,用戶能用Enable-PSRemoting cmdlet在這些工做組中的主機。
1.3在混合域環境中使用遠程管理
默認狀況下,不一樣域下的用戶即便是本地管理員組的成員仍然不能鏈接到其餘域中的主機。這是由於從其餘域的遠程鏈接只是運行在獨立的用戶權限之上。爲了能使不一樣域的主機能夠鏈接到本地計算機,用戶能夠更改LocalAccountTokenFilterPolicy註冊表鍵值(設置爲1)來容許其餘域的成員到本地計算機
PS C:\ > new-itemproperty -name LocalAccountTokenFilterPolicy -path ` HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -propertyType DWord -value 1
1.4 在企業環境下啓用遠程管理
爲了能在企業或域環境中的多臺主機上啓用遠程管理,用戶須要使用組策略,更多的信息能夠從http://technet.microsoft.com/en-us/library/dd347642.aspx地址獲取。
1.5禁用遠程管理
用戶可使用Disable-PSRemoting在本地主機上禁用遠程管理。Disable-PSRemoting將會使線程配置信息失效,這樣的操做並不會移除全部Enable-PSRemoting建立的配置,包括WinRM的啓用狀態和爲PS遠程管理建立的監聽器。
若是在本機上沒有任何服務或組件須要WinRM服務,用戶能夠經過執行下列命令禁用WinRM服務:
Set-Service winrm -StartupType Manual
Stop-Service winrm
爲了移除默認狀況下WinRM在5985端口設置的監聽器能夠執行的下述命令:
Get-ChildItem WSMan:\localhost\Listener –Recurse | Foreach-Object { $_.PSPath } | Where-Object { (Get-Item "$_\Port").Value -eq 5985 } | Remove-Item
2 執行遠程命令
在遠程管理的狀況下,有兩種方式在遠程主機上運行命令或腳本。包括Invoke-Command cmdlet和交互式遠程線程。一旦用戶在本機啓用遠程管理,用戶就能用Invoke-Command cmdlet在本機或遠程主機運行命令和腳本。
2.1 在本地或遠程主機運行腳本塊
用戶能用下面的方式在本地和遠程主機調用命令:
Invoke-Command -ComputerName WinServ-wfe -ScriptBlock {Get-Process}
腳本塊此參數能用於指定在遠程主機運行的一系列命令。若是要在本地執行命令,則ComputerName參數不是必須的。若是用戶須要在多個遠程主機上執行相同的命令,用戶能以下例所示經過逗號分隔的ComputerName參數或使用文本文件將主機清單傳遞給cmdlet:
Invoke-Command -ComputerName WinServ-wfe, SQL-Server2008 -ScriptBlock {Get-Process}
或
Invoke-Command -ComputerName (get-content c:\scripts\servers.txt) -ScriptBlock {Get-Process}
這種方式也被稱之爲散開式或一對多遠程管理。用戶能用一條命令在多臺主機上執行相同的命令。
腳本塊中全部的命令和變量均會在遠程計算機上運行。若是用戶採用相似於-ScriptBlock {Get-Process –Name $procName},PowerShell認爲遠程計算機線程中$procName變量已經定義過了。用戶能經過使用Invoke-Command命令,將本地計算機上的變量傳遞到遠程線程。
2.2 傳遞變量到遠程線程
前面的例子中,用戶能夠傳遞要尋找的進程名做爲變量。ArgumentList參數能幫助用戶傳遞到遠程線程中:
$procName = "powershell"
Invoke-Command -ComputerName (get-content c:\scripts\servers.txt) ` -ScriptBlock {param ($Name) Get-Process -Name $Name} –ArgumentList $procName
上面的例子中能夠顯示如何使用-ArgumentList參數傳遞本地變量到遠程線程。
2.3 經過Invoke-Command使用持久線程
用戶可使用帶-ComputerName參數的Invoke-Command創建臨時的線程執行遠程命令。會在每次使用Invoke-Command cmdlet時,都會從新創建線程。在只是執行簡單、爲數很少的命令時可能無所謂,可是若是要執行大量命令和腳本時將會很是的耗時費力。爲了不這種狀況,就須要使用持久線程,用戶能使用New-PSSession cmdlet建立對遠程主機的持久鏈接。
$s = New-PSSession -ComputerName WinServ-wfe
此時,$s包含持久鏈接的線程細節,可使用$s在遠程主機上調用命令語法以下:
Invoke-Commad -Session $s -ScriptBlock {get-Process}
當在遠程組合機上執行命令時,$s會包含全部建立和修改的變量。這樣以$s做爲線程的後續執行的命令可以訪問全部在遠程主機上建立和更新的變量,以下例所示:
$s = new-pssession -computername WinServ-wfe
Invoke-Command -Session $s -ScriptBlock {$fileCount = (Get-ChildItem D:\ -Recurse).Count}
invoke-command -session $s -scriptblock {$fileCount}
用戶能訪問$fileCount變量,由於是使用了持久線程執行命令。若是隻是使用-ComputerName調用命令這是不可能實現的。
2.4做爲後臺任務運行遠程命令
前面的例子中獲取遠程主機上全部D:\下的文件數量,若是包含的文件數量很大的狀況下將會很耗時,這樣就須要等待遠程命令完成執行。爲了不這一點,用戶可使用-AsJob參數使命令做爲遠程主機的後臺任務。命令格式以下所示:
Invoke-Command -ComputerName WinServ-wfe -ScriptBlock {(Get-ChildItem D:\ -Recurse).Count} –asJob
執行後效果以下圖4所示:
當用戶使用帶-AsJob參數的Invoke-Command cmdlet時,遠程主機上的後臺任務將會被建立和運行,在後臺任務被建立後,可使用*-job cmdlet管理任務對象。
好比,用戶可使用Get-Job監控任務的狀態而且一旦任務狀態變爲完成,就可使用Receive-Job cmdlet獲取指定腳本塊的輸出。
Get-Job –id 3 | Receive-Job
用戶也能使用Start-Job在遠程主機上用腳本塊建立後臺任務。然而,經過這樣方式創建的任務的輸出結果只會在遠程主機上顯示。當用戶須要從該後臺任務獲取輸出輸出時,就須要在Invoke-Command調用的腳本塊中使用Receive-Job cmdlet。
2.5 爲遠程管理指定憑據
前面的文章裏,可以用在工做組中的計算機間使用PowerShell遠程管理。在前面的例子中只是假定是使用管理員權限訪問遠程計算機,這樣的方式能夠在域中任何以管理員憑據登錄的計算機上在域環境中很好的工做,用戶不須要顯式的傳遞憑據給Invoke-Command。然而,這樣的方式是沒法在工做組環境下使用,須要傳遞憑據給Invoke-Command,以下例所示:
$cred = Get-Credential
Invoke-Command -ComputerName WinServ-wfe -ScriptBlock { Get-Process} -Credential $cred
在上面的例子中,Get-Credential會向用戶索取訪問遠程主機的憑據,並使用該憑據調用Invoke-Command cmdlet。
3 總結
在本文中,首先介紹瞭如何啓用powershell的遠程管理,以及如何在工做組和混合域環境下配置計算機,須要注意的是禁用遠程管理不能經過Enable-PSRemoting的逆操做來實現。若是本地計算機再也不須要遠程管理功能,用戶須要手動撤銷全部的設置,包括中止和禁用WinRM服務,移除爲可信主機添加的監聽器。
接下來介紹瞭如何使用Invoke-Command cmdlet用於在遠程主機上執行命令,建立持久線程,在多個命令間同一線程傳遞的變量和參數。用戶還能夠在執行較費時的命令時之後臺任務的形式實現,並在執行完畢後使用命令回調執行結果。