Windows PowerShellBest Inventory Tool Ever!

Don Jones

Contenuto

Lo strumento di esplorazione
Unità di test
Computer en Masse
Cosa È fare con si?
Verrà inoltre
Potenti strumenti Do-It-Yourself

In rate alcuni precedenti di questa colonna, È stato dimostrato diverse tecniche per l'utilizzo di Windows PowerShell per la raccolta informazioni sul magazzino del computer.In questo aggiornamento verrà assemblare tutti gli elementi in un strumento pronte per l'esecuzione che è possibile raccogliere qualsiasi tipo di informazioni da Strumentazione gestione Windows (WMI).

Video

Esegue il wrapping Don Jones la serie sulla creazione di uno strumento di inventario molto potente e completo.In questo flusso video, viene illustrato il testo finale che sarà necessario aggiungere.

E lo strumento verrà essere progettato per gestire un elenco di testo di nomi di computer o recuperare da Active Directory i nomi di computer.

Lo strumento di esplorazione

Inizierà con lo script (vedere la Figura 1 ), un'istruzione alla volta gli elementi della relativa struttura ed esaminare alcuni i suggerimenti viene utilizzato.Parte di queste tecniche può sembrare un po'dispari o esaurito a posizione, ma sono lumping li in questa posizione, in modo È possibile illustrare numerose interessanti suggerimenti in uso.

Nella figura 1 lo script

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. }  

Nella riga 1, è possibile visualizzare che la funzione è denominata WmiInventory Get. Sotto, È possibile definire un parametro di input denominato $ wmiclass e assegnarle un valore predefinito di "Win32_OperatingSystem". Il scriptblock PROCESS indica che si tratta di una funzione di filtro, una progettato per accettare un insieme di nomi di computer dalla pipeline, si vedrà in seguito come è possibile passare le informazioni la funzione.

Riga 6 viene disattivata normale comportamento di segnalazione degli errori la shell poiché desidera fornire il proprio registrazione degli errori. E riga 7 semplicemente acquisisce nome computer corrente (come reindirizzato alla funzione) nel computer $ variabile.

Valore di ora Vai a riga 13, in cui è possibile creare una variabile denominata $ ignorare e impostarla al valore Boolean false (ulteriori in tale in seguito). Nella riga 14, è possibile quindi tentare ottenere le informazioni desiderate WMI dal computer corrente utilizzando il cmdlet WmiObject Get. Si noti che È stato specificato il parametro –ErrorAction (o –EA), che indica la shell per generare un'eccezione se il recupero di WMI ha esito negativo per qualsiasi motivo.

Riga 15 controlla se il simbolo $ Ignora ancora variabile contiene false. Se avviene, quindi riga 16 enumerato qualsiasi provenienza nuovamente WMI e aggiunge (su linea 17) una proprietà di nome computer per ogni oggetto WMI. In questo modo, quando lo script sta restituendo oggetti WMI da più computer, ciascuno di essi è etichettata con relativo nome computer padre in una proprietà semplice progetto. Riga 18 restituisce ogni oggetto per la pipeline, pertanto è possibile affrontare cmdlet un altro o rendere formattazione sottosistema la shell su per visualizzare alcune proprietà dell'oggetto.

Ma cosa succede se qualcosa va errato? Poiché È specificato –EA Interrompi, la shell eseguirà la registrazione nella riga 8. In primo luogo, scrive il nome computer un file di testo in modo che sia un log dei nomi di computer non è riuscita l'inventario. Quindi, nella riga 10, è possibile impostare la $ Ignora variabile sul valore booleano true. Che lo script tenti di output di qualsiasi riga 15, ovvero se non eseguita questa operazione, quindi genera le informazioni sul magazzino del computer precedente in output nuovamente ogni computer che non riesce.

Windows PowerShell domande e risposte su

D È possibile utilizzare Windows PowerShell per gestire server principale di Windows Server 2008?

A assolutamente. Oh, è stato probabilmente sentito che Windows PowerShell non sia installato nel server core poiché componenti di base Server attualmente non supporta .NET Framework, che richiede la shell. Ma questo non è un problema. Molti amministratori pertanto consigliabile non installare nulla sui server se consentono e Windows PowerShell non è fa eccezione. Invece è possibile installare Windows PowerShell nel computer client e utilizzare per gestire in remoto Server Core utilizzando tali tecnologie come Windows Management Instrumentation (WMI), Active Directory e molto altro ancora. Molti aspetti di Active Directory su un controller di dominio in base a Server Core, senza lasciare comfort della scrivania, ad esempio, è possibile, gestire con facilità.

Riga 10 viene utilizzata una tecnica diversa per impostare la variabile: la registrazione stesso è un ambito variabile privato e non contiene variabile $ Ignora. Il simbolo $ ignorare la variabile desiderata da ambito padre la registrazione, un livello superiore. Il cmdlet variabile set consente di modificare la variabile utilizzando il - parametro di ambito, che indica che l'ignora $ sono interessato a è un livello alto. Si noti inoltre che quando si utilizza insieme a variabile, il nome della variabile non includa il simbolo $ davanti a esso.

Unità di test

Un metodo semplice per verificare questo consiste di pipe solo in un unico nome computer, simile al seguente:

"localhost" | Get-WmiInventory 

Poiché non È stata specificata un nome di classe WMI, viene utilizzato il valore predefinito di Win32_­OperatingSystem. Per specificare una classe diversa, è necessario eseguire questo:

"localhost" | Get-WmiInventory "Win32_LogicalDisk"

Nella figura 2 vengono mostrati i risultati. E se si desidera includere più nomi di computer, sufficiente aggiungere un elenco delimitato da virgole di essi in questo modo:

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

fig02.gif

Nella figura 2 WmiInventory Ottieni risultati

Computer en Masse

Specifica i nomi dei singoli computer è piuttosto noioso, se si dispone di un lungo elenco. Se disponi già di un elenco di nomi di computer in un file di testo, nome computer uno per riga, quindi è possibile creare una pipe i nomi da destra alla funzione di magazzino in questo modo:

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

Un'altra tecnica implica l'utilizzo del cmd­let QADComputer get, fornita come parte del cmdlet Active Directory disponibile disponibili quest.com/powershell. È necessario installare il cmdlet di Active Directory, aprire Windows PowerShell ed eseguire:

Add-PSSnapin Quest.ActiveRoles.ADManagement

Eseguire QADComputer Leggi per recuperare tutti i computer da Active Directory. Ma tenere presente che in un dominio grandi dimensioni, questo richiederà un determinato periodo di tempo. È possibile eseguire Guida in linea di Get-QADComputer per vedere alcune delle opzioni disponibili per filtrare l'elenco dei computer, ad esempio cattura solo tali computer che risiedono in un'unità organizzativa specifica (OU). È inoltre necessario apportare una modifica secondaria lo script modifica riga 7

$computer = $_

$computer = $_.Name

Questa operazione è necessaria poiché gli oggetti generati da Get-QADComputer archiviano il nome computer in una proprietà nome anziché come un oggetto stringa semplice.

Cosa È fare con si?

Output predefinito di questo script avrà qualsiasi modulo per impostazione predefinita verrà creato il sottosistema di formattazione di Windows PowerShell. Ad esempio, la classe Win32_OperatingSystem è un piccolo sottoinsieme (solo sei proprietà) delle informazioni effettivamente disponibili da tale classe. È possibile inviare output di questo script a qualsiasi cmdlet shell standard per personalizzare l'output che. Pertanto, per visualizzare il numero di build e servizio informazioni pack, insieme con i nomi di computer, procedere come:

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

Si desidera ottenere un inventario dei servizi installati e generare una tabella HTML, utilizzare:

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

E se si desidera ottenere un inventario completo di informazioni disco logico e scrivere un file (con estensione CSV) di valori separati da virgole, eseguire questo:

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

Si noti che poiché la funzione Get-WmiInventory restituisce gli oggetti, non semplice testo, la shell può fare piuttosto un po'per aiutare a ottenere i dati nel modulo che è necessario se si tratta di statistiche tendenze, Gestione report, o solo rapido osservare le informazioni critiche.

Verrà inoltre

Un punto debole nello script corrente è che recupera tutti gli oggetti WMI dalla classe che si specifica. Con alcune classi che potrebbe essere troppi dati. Preferiscono in genere limitare Win32_LogicalDisk in modo che è possibile recuperare solo dischi locali dispongono di una proprietà DriveType di 3. È possibile modificare facilmente lo script per includere criteri di filtro simile, lo script modificato è illustrato nella Figura 3 . Per chiamare questo nuovo script, è possibile utilizzare questo:

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

Nella figura 3 lo script modificato per supportare il filtro

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. }

Semplicemente, le modifiche, nelle righe 4 e 15, raccolgono un nuovo parametro denominato $ filtro e passare al parametro –filter di WmiObject Get. Quando viene chiamata la funzione, il parametro di filtro $ è in secondo luogo, in modo che passato come secondo valore dopo il nome della classe WMI. C'è plenty più che per personalizzare questa funzione per l'ambiente specifico, ma esistono alcuni aspetti è consigliabile evitare di operazioni:

  • Non è la funzione di inviare l'output di solo ma la pipeline, che viene eseguita sulla riga 19 dello script modificato. In altre parole, non avere le informazioni di output funzione in un file. Invece eseguire l'output della pipeline della funzione e inviare un cmdlet, ad esempio Out-File, che passa l'output a un file o altro supporto. Ciò garantisce che la funzione mantiene la flessibilità.
  • Non filtrare le informazioni all'interno la funzione, ad esempio la proprietà dell'oggetto WMI di rimozione oppure output solo un sottoinsieme di proprietà. Questo sarebbe troppo si riduce flessibilità della funzione per gli scenari future. Al contrario, se non è necessario tutte le informazioni da output, inviare che di output per un cmdlet di formato o oggetto selezionare in modo da ottenere solo le informazioni che necessarie per l'attività da eseguire.
  • Non aggiungere attività aggiuntive alla funzione. Tenere ogni funzione compiti singola, anziché super-functions generazione che numerose operazioni. Se si dispone di un processo complesso, eseguire la creazione di ciascuna attività discrete come funzione autonomo e quindi inviando informazioni da uno a un altro. In questo modo ogni funzione più flessibile, più facile da gestire e molto più facile eseguire il debug.

Potenti strumenti Do-It-Yourself

Durante uno script come questo è disponibili sostituzioni per un sistema di gestione configurazione potente come System Center Configuration Manager, offrire un modo semplice per magazzino selezionare informazioni da un insieme di computer remoti. Questo script è un buon esempio di una delle operazioni Windows PowerShell è ottimale in: fornire una soluzione ad hoc e rapida ai problemi che non prevedano Microsoft durante la creazione di Windows o qualsiasi altro prodotto in uso.

Poiché questo particolare script utilizza WMI, funziona con i computer tutti i fino a Windows NT 4.0 risalire, anche se Windows PowerShell stesso non può essere installato su un computer che precedente. E, poiché molti prodotti Microsoft espongono le informazioni di gestione tramite WMI, è possibile raccogliere informazioni da vari prodotti. Desidera utilizzare uno strumento di explorer WMI (un gratuito uno è in ScriptingAnswers.com Nella "strumenti di zona") per individuare le informazioni WMI disponibili in un computer e quindi utilizzare uno script simile al seguente quello È stato illustrato di seguito per raccogliere le informazioni dai più computer.

Don Jones un partner Concentrated relativo alle tecnologie e coautore di Windows PowerShell: TFM (Press SAPIEN). Ottenere suggerimenti di Windows PowerShell settimanale e contattare Don, in ConcentratedTech.com.