Windows PowerShell最佳 Inventory Tool 過 !

Don Jones

內容

瀏覽工具
測試磁碟機
電腦半形 Masse
您如何與它如何哪些?
要進一步
功能強大的 Do-It-Yourself 工具

在過去幾個 installments 這個資料行的我已經示範使用 Windows PowerShell 收集電腦清查資訊的各種技術。此單元,我將組合所有到一項已經可以執行的工具,可以從 Windows Management Instrumentation (WMI) 收集任何種類的資訊。

視訊

Don Jones 會包裝他系列建置一個非常強大、 功能完整的清查工具設定。在這個資料流的視訊中他示範最後您要新增的修飾。

且將設計工具使用任一文字的電腦名稱清單或從 Active Directory 查詢的電腦名稱。

瀏覽工具

我將開始使用本身的指令碼 (請參閱 [圖 1 ),逐步執行其結構的項目,和一些在這裡查看它使用。這些技巧似乎有點奇怪或傳出位置,但是我 lumping 它們在這裡讓我可以示範各種不同的使用很酷的技巧。

[圖 1] 指令碼

1. function Get-WmiInventory {
2.  param (
3.  $wmiclass = "Win32_OperatingSystem"
4.  )
5.  PROCESS {
6.   $ErrorActionPreference = "SilentlyContinue"
7.   $computer = $_
8.   trap {
9.    $computer | out-file c:\errors.txt -append
10.    set-variable skip ($true) -scope 1
11.    continue
12.   }
13.   $skip = $false
14.   $wmi = Get-WmiObject -class $wmiclass -computer $computer -ea stop
15.   if (-not $skip) {
16.    foreach ($obj in $wmi) {
17.     $obj | Add-Member NoteProperty ComputerName $computer
18.     write $obj
19.    }
20.   }
21.  }
22. }  

列 1,您可以查看的函式名為 Get-WmiInventory。 下面的我可以定義名為 $ wmiclass 的輸入的參數,並指定預設值為"Win32_OperatingSystem。 PROCESS scriptblock 表示這是一個用來接受從管線的電腦名稱的集合資料篩選功能,您會看到稍後我傳遞該資訊到函式。

列 6 會關閉殼層的標準錯誤報告行為,因為我要提供自己的錯誤記錄。 並列 7 只擷取目前的電腦名稱 (如傳送到函式) 插入變數 $ 電腦。

現在,我會建立名為 $ 變數的移至行 13,略過,並將它設定為將布林值的值 false (詳細中)。 在列 14,我再嘗試使用 Get-WmiObject cmdlet 擷取所需的 WMI 資訊從目前的電腦。 請注意我已指定 –ErrorAction (或 –EA) 參數,指示殼層,以產生例外狀況,如果由於任何原因而失敗的 WMI) 擷取。

列 15 檢查如果 $ 略過變數仍包含為 false。 如果存在,然後透過任何上一步是來自 WMI 列舉行 16,並 (在行 17) 中加入 ComputerName 屬性以每個 WMI 物件。 如此一來,指令碼會傳回從多部電腦的 WMI 物件時,每個會標示為其父代電腦名稱是在方便的屬性。 行 18 會輸出到管線每個物件,讓另一個 Cmdlet 可以處理,或因此殼層的格式化的子系統可以透過花費,要顯示某些物件的屬性。

但是,如果發生錯誤? 因為我指定 –EA 停止,殼層就會第 8 行上執行設陷。 先,它將電腦名稱寫入文字檔這樣我的電腦名稱失敗詳細目錄的記錄檔。 然後,列 10,我在 $ 略過變數設定為 True 布林 (Boolean) 值。 這可防止指令碼嘗試將輸出任何在列 15 — 如果未完成此,然後失敗每部電腦可能會導致舊電腦的清查資訊一次的輸出。

Windows PowerShell Q & A

問: 我可以使用 Windows PowerShell 管理 Windows Server 2008 伺服器核心嗎?

A 絕對。 喔,您可能聽說 Windows PowerShell 無法可以安裝在伺服器核心,因為伺服器核心目前不支援.NET Framework 殼層的需要。 但這不是問題。 大量的聰明的系統管理員沒有安裝任何伺服器上如果它們可以協助它,且 Windows PowerShell 沒有例外狀況。 而,您可以在您的用戶端電腦上,安裝 Windows PowerShell 並用它來使用 Windows Management Instrumentation (WMI)、 Active Directory,和更多的這類技術從遠端管理伺服器核心。 執行個體,您可以輕鬆地管理伺服器核心的基礎網域控制站,不必離開您的所有 Active Directory 的大部分層面。

列 10 會使用不同技術設定變數: 設陷本身在私用變數的範圍且它不包含 $ 略過變數。 $ 略過我想是來自設陷的父範圍上, 一層的變數。 Set-變數 Cmdlet 可讓我修改變數,使用-範圍參數,表示我感興趣,$ 略過設定為一個層級。 也請注意當您使用 Set-變數,變數的名稱不包含在它前面的 $ 符號。

測試磁碟機

一個簡單的方法進行測試,就是只管道單一的電腦名稱如下:

"localhost" | Get-WmiInventory 

因為我有沒有指定 WMI 類別名稱,使用預設的 Win32_­OperatingSystem。 請指定不同的類別,這麼做:

"localhost" | Get-WmiInventory "Win32_LogicalDisk"

[圖 2 ] 顯示結果。 如果要包含多個電腦名稱只進行的逗號分隔清單就像這樣:

"localhost","server2","client17" | 
Get-WmiInventory "Win32_LogicalDisk"

fig02.gif

[圖 2 Get-WmiInventory 結果

電腦半形 Masse

指定個別的電腦名稱,就很冗長,如果您有很長的清單。 如果您在文字檔中已經有電腦名稱的清單 — 一部電腦的名稱,每行,然後您可以傳送右庫存函式的名稱,藉由執行這項操作:

Get-Content c:\names.txt | Get-WmiInventory "Win32_Service"

另一個技術牽涉到 Get-QADComputer cmd­let,從 Quest.com/powershell,做為可用的 Active Directory Cmdlet 可用的一部分會提供的使用。 您需要安裝 Active Directory Cmdlet,開啟 Windows PowerShell,並執行:

Add-PSSnapin Quest.ActiveRoles.ADManagement

執行 Get-QADComputer 從 Active Directory 擷取的所有電腦。 但請注意大域中這會花了 ! 您可以執行 [說明] 取得-QADComputer,查看某些選項可供篩選台電腦例如只抓取這些電腦位於特定的組織單位 (OU) 的清單。 您也需要次要變更的指令碼變更行 7

$computer = $_

$computer = $_.Name

這是必要的因為 Get-QADComputer 所產生的物件會儲存電腦名稱,在名稱屬性,而不是簡單的字串物件。

您如何與它如何哪些?

這個指令碼的預設輸出將在 Windows PowerShell 格式化子系統會建立預設的任何表單。 例如,Win32_OperatingSystem 類別,會是小子集 (只在六個屬性) 實際上會從該類別可用資訊。 您可以傳送任何標準的殼層 Cmdlet,以自訂的輸出指令碼的輸出。 所以,顯示建置號碼及 Service Pack 資訊,使用在電腦名稱,以及這麼做:

Get-Content c:\names.txt | Get-WmiInventory | 
Format-List BuildNumber,ServicePackMajor­Version,­ComputerName

如果您要取得的已安裝的服務清單,並將產生的 HTML 資料表時,請將這個執行:

Get-Content c:\names.txt | Get-WmiInventory "Win32_Service" | 
ConvertTo-HTML | Out-File c:\services_inventory.html

並如果您想要取得邏輯磁碟資訊的一個完整的清單,並將逗點分隔的值 (CSV) 檔案將它寫入執行這個動作:

Get-Content c:\names.txt | 
Get-WmiInventory "Win32_LogicalDisk" | Export-CSV c:\disks.csv

請注意因為 Get-WmiInventory 函式會產生不簡單的文字的物件殼層可以相當位元,協助您資料至表單,您需要是否的統計趨勢、 管理的報表或只是重要資訊,快速檢視。

要進一步

目前的指令碼中的一個弱點,是它擷取 WMI 物件的所有從您所指定的類別。 使用部分類別,可能會太多資料。 通常我想限制,以便我只擷取本機磁碟有 3 的 DriveType 屬性的 Win32_LogicalDisk。 我可以輕易地修改加入篩選條件的指令碼 — 修改過的指令碼如 [圖 3 ] 所示。 若要呼叫這個新的指令碼,我使用這個:

Get-Content c:\names.txt | 
Get-WmiInventory "Win32_LogicalDisk" "DriveType='3'"

[圖 3 修改過的指令碼支援篩選

1. function Get-WmiInventory {
2.  param (
3.   $wmiclass = "Win32_OperatingSystem"
4.   $filter = ""
5.  )
6.  PROCESS {
7.   $ErrorActionPreference = "SilentlyContinue"
8.   $computer = $_
9.   trap {
10.    $computer | out-file c:\errors.txt -append
11.    set-variable skip ($true) -scope 1
12.    continue
13.  }
14.  $skip = $false
15.  $wmi = Get-WmiObject -class $wmiclass -computer $computer -ea stop –filter $filter
16.  if (-not $skip) {
17.    foreach ($obj in $wmi) {
18.     $obj | Add-Member NoteProperty ComputerName $computer
19.     write $obj
20.    }
21.   }
22.  }
23. }

在行 4 和 15,變更只會收集新參數,名為 $ 篩選器,並將它至 Get-WmiObject 的 –filter 參數中傳遞。 當呼叫函式,$ 篩選器參數是第二個,因此它的 WMI 類別名稱之後傳遞做為第二個值。 還有 plenty 更多您可以自訂您的特定環境這個函式但有幾件事,您應該避免執行:

  • 不需要傳送其輸出至以外管線是第 19 行修改指令碼的函式。 也就是說不需要函式的輸出資訊檔案。 取得函式的管線輸出並傳送一個 Cmdlet,例如 out-file 的移動輸出至檔案或其他媒體。 這將確保函式會保留其彈性。
  • 不要篩選函式內的資訊 — 例如移除 WMI 物件的屬性,或只輸出屬性的子集。 這太會降低未來的案例的函式的彈性。 而,如果您不需要的所有資訊的輸出,管道,以便您可以取得您需要手邊的工作,資訊輸出到格式 Cmdlet 或選取的物件。
  • 不要加入函式的其他工作。 請保留每個函式一把而不是執行許多事情的建築物 Super-functions。 如果您在複雜的程序完成它藉由建立每個獨立的工作,為獨立的函式,然後管線的另一個資訊。 這可以讓每個函式更具彈性且更容易偵錯易於維護。

功能強大的 Do-It-Yourself 工具

雖然指令碼類似,這不是功能強大的組態管理系統例如,System Center Configuration Manager 任何取代,它不會提供選取的清查資訊從遠端電腦的一組簡單的方法。 這個指令碼會是很好的其中一個 Windows PowerShell 是在最佳作業範例: 提供快速、 臨機操作解決方案,Microsoft 在建立 Windows 或任何時未預見的問題其他產品您使用。

因為這個特定的指令碼會使用 WMI,它可與電腦所有 Windows NT 4.0 回 — 即使的舊電腦上安裝 Windows PowerShell 本身,無法 ! 並,您也可以因為許多 Microsoft 產品會公開透過 WMI 的管理資訊,您可以從各種產品收集資訊。 我要使用 WMI Explorer 工具 (在用其中一個是在 scriptinganswers.com 「 工具區域中 」) 來瀏覽可用的 WMI 資訊在電腦上然後使用我已從多部電腦中收集該資訊如下所示的類似指令碼。

Don Jones 專注技術和合著 Windows PowerShell: TFM 》 (SAPIEN Press) 的夥伴。 取得每週的 Windows PowerShell 秘訣,並將連絡 Don, ConcentratedTech.com.