Windows PowerShell一窺 2.0 版中的遠端管理

Don Jones

本專欄是根據 Windows PowerShell 的搶鮮版所撰寫。本文包含的所有資訊均有可能變更。

目錄

兩種遠端處理類型
同步與非同步比較
可重複使用的 Runspace
收合傳送遠端處理
2.0 中的超級應用程式

您有機會嘗試 Windows PowerShell 2.0 最新版的 Community Technology Preview (CTP)嗎?最新版 CTP2 更進一步強化了遠端管理,而現在正是開始著手了解它的新功能的好時機。開始之前,您應該花點時間

go.microsoft.com/fwlink/?LinkID=119707 下載這個新版本。

首先,讓我釐清一下幾個重點。CTP 是 Beta 測試版前的程式碼,Microsoft 專為像我這種迫不及待的使用者提供 CTP,來稍微了解 Microsoft 在下一版的應用程式所朝的方向。每個 CTP 里程碑或 Drop (他們在業界都這麼稱呼) 可能與前一個 Drop 完全不同。這是因為開發小組會收集意見反映,仔細檢討,然後根據這些使用者意見來修改應用程式。這套方法針對 CTP 的使用帶來了重要的好處和警告。

好處是,當您使用 CTP 時,您能在開發期間提供產品相關的意見反映 (透過 connect.microsoft.com 網站),也就是說開發小組仍然能夠針對您的意見反映採取行動!如果您等到 Beta 測試版,甚至拖到 Release Candidate 階段,要實現您的意見就難得多了。在 CTP 期間,任何事情都可能發生,而且開發小組能夠在必要時,進行龐大且廣泛的變更。

這就把話題帶到警告的部分,那就是 CTP 還不適合用於生產環境。沒錯,Windows PowerShell™ 2.0 CTP2 可能是您看過最穩定的預先發行程式碼之一,但是別忘了,下一個 CTP 的 Drop 可能又是個截然不同的應用程式。因此,不要這麼倚賴 CTP2,因為在下一版,您可能又要重新來過。

要注意的是,CTP 並不能與 Windows PowerShell 1.0 並行安裝。系統還必須安裝 Microsoft® .NET Framework 3.5,以啟用所有可用的功能,才算是理想的設定。否則,有些功能可能會受到限制。

再加上 CTP 是非常初期的程式碼,因此 Microsoft 目前主要把重點放在應用程式在最新版作業系統上的運作情況,也就是 Windows Vista® 和 Windows Server® 2008。目前的 OS 相容性並不等於在最終發行程式碼提供的 OS 相容性。回溯移植在開發週期後期才會考慮。

兩種遠端處理類型

在遠端管理的世界中,您通常會看到兩種類型的遠端處理:收合傳送和展開傳送。收合傳送遠端處理包含多名系統管理員與單一伺服器進行安全殼層連線。Windows PowerShell 是為了在安全、分隔的方式下進行這個作業而設計的,舉例來說,像 Exchange Server 虛擬主機公司便能為客戶提供系統管理存取權,存取屬於客戶部分的伺服器。透過收合傳送遠端處理,您便能對遠端伺服器上安裝的 Windows PowerShell (僅限 2.0 版!) 進行安全、遠端、互動式存取。

當您一次對一整組遠端伺服器發出一組命令時,便會進行展開傳送遠端處理。從工作站對伺服器組發出的「展開傳送」命令是並行進行的。命令會在每部伺服器上執行,而且結果 — 以 Windows PowerShell 物件的形式 — 會傳回到您的工作站,供您檢閱與使用。Windows PowerShell 支援兩種核心技術來進行展開傳送遠端處理 — Windows® Management Instrumentation (WMI) 與 Windows Remote Management (WinRM),這首先是跟著 Windows Server 2008 一同發行,隨後在 Windows PowerShell 2.0 CTP 中更新。

同步與非同步比較

其實 Windows PowerShell 1.0 也有一些基本的展開傳送功能是繫結到 WMI。比如,您可以輕易建立電腦名稱陣列,然後從各個當中擷取 WMI 類別:

$names = @("server1","server2","server2")
Get-WmiObject Win32_OperatingSystem 
    –computer $names

執行方法 — 例如重新開機 — 就需要多費點力,因為 1.0 版並沒有提供大量執行 WMI 方法的管道。不過,這在 2.0 版的 CTP 已經改觀,都要歸功於 Invoke-WmiMethod 指令程式。

$names = @("server1","server2","server2")
Get-WmiObject Win32_OperatingSystem     –computer $names | `
 Invoke-WmiMethod Reboot

但是這項技術有個問題,那就是它是同步的,換句話說,一次只會聯繫一部電腦,而且您必須等到每部電腦完成後才能執行其他命令。而 CTP 引入了新概念 — 背景工作 — 允許這類的命令在背景執行。最簡單的用法是,直接加入 –AsJob 參數讓 WMI 命令在背景執行:

$names = @("server1","server2","server2")
Get-WmiObject Win32_OperatingSystem     –computer $names -asjob

您可以執行 Get-PSJob 來檢閱所得的工作狀態,執行 Receive-PSJob 來查看工作的最後結果 (我會在下期專欄深入探討工作管理背後的細節)。而 Invoke-Command 指令程式則提供更佳的管道在背景執行命令,像這樣:

$command = { Get-WmiObject     Win32_OperatingSystem }
$names = @("server1","server2","server2")
Invoke-Command –command $command     –computer $names –asjob

這其實是將 Get-WmiObject 命令向外推入指定的每部電腦,然後它會在本機執行。它的執行速度通常快得多,而且不用仰賴 WMI 遠端程序呼叫 (RPC) 連線。Invoke-Command 反而是利用 WinRM,它預設是使用連接埠 80 或 443。這些連接埠不但方便瀏覽防火牆,而且完全可設定。Invoke-Command 也支援其他參數以採用替代的憑證和節流,允許您鎖定上百部電腦為目標,但只平行執行其中的少數。這可避免壅塞及過多的負荷。

可重複使用的 Runspace

如果您打算多次從遠端管理一組特定電腦,應該考慮使用 Runspace,而不是簡單的電腦名稱清單。在 Windows PowerShell 中,無論是在電腦上從本機作為殼層主控台視窗執行,或是在遠端電腦的背景執行,Runspace 都只是殼層引擎的執行個體。啟動遠端 Runspace 很簡單:

$names = @("server1","server2","server2")
New-RunSpace –computer $names

因為 Runspace 也使用 WinRM,所以它們預設也是使用連接埠 80 (或是 443,如果您指定 –UseSSL 參數的話),而且也可以接受替代憑證等。如果您擷取產生的 Runspace 物件,可以將它們傳遞給 Invoke-Command,而 Windows PowerShell 會將該命令向外推入那些 Runspace 所存在的電腦上:

$command = { Get-WmiObject     Win32_OperatingSystem }
$rs = Get-Runspace
Invoke-Command –command $command     –runspace $rs –asjob

這裡的好處是,只要殼層處於開啟狀態,Runspace 會一直保持作用狀態,因此您可以直接將它們重複用於其他命令。

收合傳送遠端處理

Runspace 也是收合傳送遠端處理的關鍵。例如,[圖 1] 說明我在遠端電腦上已建立了一個 Runspace,擷取了該 Runspace 的參考,然後使用 Push-Runspace 指令程式來啟動 Runspace。此時,我是在遠端電腦上執行命令,跟 SSH 或其他遠端殼層公用程式允許進行的動作沒什麼兩樣。執行 Pop-Runspace 帶回了我原始的「本機」Runspace,而且殼層提示還幫我隨時追蹤我所在之處。

fig01.gif

[圖 1] 使用 Runspace 在遠端電腦上執行命令 (按一下以放大影像)

我執行的實際命令順序如下:

PS C:\>new-runspace -computer     "WIN-YFZXQMHXAWM"
PS C:\>$server2 = get-runspace -sessionid 2
PS C:\>push-runspace $server2
[win-yfzxqmhxawm]: PS C:\Windows\System32>    pop-runspace
PS C:\>

這項技術之所以稱為收合傳送,是因為多名系統管理員可以同時在相同的伺服器上開啟遠端互動式 Runspace — 他們從個別的工作站「收合傳送」到伺服器。Windows PowerShell 2.0 中全新的安全性模型可讓您建立限制的殼層和指令程式,以防止各個系統管理員進行全域修改。每名系統管理員都僅限修改自己的殼層區域 (這些新安全性技術需要以 .NET Framework 為目標的語言進行一些自訂軟體開發。這已超過 Windows PowerShell 專欄的討論範圍,不過知道有這些功能挺不錯的)。

2.0 中的超級應用程式

Windows PowerShell 2.0 CTP 有一長串出人意表的新功能。我個人認為遠端處理是最棒的應用程式。幾乎各種環境內的每個系統管理員都可以從中受益。

您應該讓自己熟悉這些功能,這樣才能提供建議給產品小組。您希望透過群組原則來管理 WinRM 預設連接埠嗎?指令程式應該以不同的方式運作嗎?有任何效能方面的問題嗎?WinRM 容易設定嗎?您可以將意見送到 connect.microsoft.com 或是與 MVP 得獎人 (包括我本人在內,若要與我連絡,請將您的意見送到 ScriptingAnswers.com 上的論壇) 分享您的意見,藉此發揮影響力。所以,趕快共同加入來協助建置下一代 Windows PowerShell 的超級應用程式!

本月指令程式:Select-Object

試試看:Get-Service | ConvertTo-HTML | Out-File Services.htm。現在到網頁瀏覽器中看看產生的 HTML 檔案。資訊一籮筐,對吧?要是有方法可以只選取您感興趣的資訊來精簡資料的話,該有多好。這正是 Select-Object 可以幫上忙的地方。譬如,假設您只想要服務名稱及其目前狀態的清單。可以使用:Get-Service | Select Name,Status | ConvertTo-HTML | Out-File Services.htm。

不過,有件事您要記得,那就是 Select-Object 會丟棄原始物件 — 在本例中,亦即服務 — 而且會產生當中只包含您指定屬性的自訂物件 (實際上是 PSCustom 物件類型)。原始物件的任何功能都不能再存取,因此您可能會想要把 Select-Object 留在管線的尾端,盡可能充分利用原始物件。

Don Jones 是《Windows PowerShell v2.0:TFM》的作者之一,並且是 ScriptingAnswers.com「Special Forces」課堂訓練課程背後的培訓講師 (scriptinganswers.com/training.asp)。您可以透過電子郵件與他連絡:jeepdon@mac.com

© 2008 Microsoft Corporation and CMP Media, LLC.著作權所有,並保留一切權利。未經許可,不得部分或全部重製。