PowerShell 2.0遠程管理之啓用和執行命令

PowerShell 2.0的遠程管理功能很強大,爲了方便讀者學習這裏首先介紹學習環境的設置,便於讀者在理解原理的同時有相對形象的體驗。在本文中,將會分別介紹瞭如何啓用和禁用powershell的遠程管理,以及如何在工作組和混合域環境下配置計算機。以及如何使用Invoke-Command cmdlet用於在遠程主機上執行命令,創建持久線程,在多個命令間同一線程傳遞的變量和參數。用戶還可以在執行較費時的命令時以後臺任務的形式實現,並在執行完畢後使用命令回調執行結果。
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用於在遠程主機上執行命令,創建持久線程,在多個命令間同一線程傳遞的變量和參數。用戶還可以在執行較費時的命令時以後臺任務的形式實現,並在執行完畢後使用命令回調執行結果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章