Windows PowerShellCreazione di un software Inventory Tool

Don Jones

Contenuto

Trovare le informazioni
Creazione di prototipi
Leggere i nomi di computer
Modularizing
Funzioni di pipeline

In questo aggiornamento della colonna di Windows PowerShell, mi intendo per illustrare un utilizzo molto pratico: genererà uno strumento rilevazione il numero di build del sistema operativo (uno dei modi migliori per determinare la versione del sistema operativo) e service pack numero di versione da un elenco di comput­ers.Ma non appena verrà per fornire la soluzione definitivamente.Verrà dettagliatamente il processo che è possibile utilizzare per sviluppare uno script simile al seguente.

Sebbene sia ovviamente uno strumento utile, RITENGO che il processo di cui è possibile sviluppare lo strumento è ancora più importante.Una volta comprendere e possibile riutilizzare questo processo di sviluppo per le proprie attività, sarà ottimale sulle opzioni per la risoluzione di quasi qualsiasi problema amministrativo utilizzando Windows PowerShell.(Come la vecchia informare che consente di spostarsi, se insegnare un uomo per creare uno strumento …) Pertanto, si iniziare.

Trovare le informazioni

Il primo e spesso molto difficili, è necessario individuare effettivamente disponibili del sistema operativo e numeri di versione service pack.Si potrebbe essere tentati di passare spelunking nel Registro di sistema.Il Registro di sistema è a volte la risposta per informazioni, ad esempio questo, ma in genere la possibilità di ultima risorsa dal momento che il Registro di sistema può essere un po'difficile per l'utilizzo con.

Le parole "recuperare" e "informazioni" attivare immediatamente una possibile risposta il presente: Strumentazione gestione Windows (WMI).Un'altra parola chiave che mi pensare a WMI è "remoto", poiché nella versione 1 di Windows PowerShell, WMI è sull'opzione solo per eseguire qualsiasi tipo di operazione magazzino o gestione informazioni remote.

Purtroppo, nella maggior parte dei sistemi Windows esistono decine di migliaia di classi WMI e questo può rendere difficile individuare la quella che contiene le informazioni che necessarie.In genere in iniziare con un motore di ricerca Web e che Perforatore in una frase ad come "WMI service pack versione numero". Si noti che sarà necessario una frase di ricerca piuttosto lungo simile per generare risultati più specifici.

Anche potrebbe essere necessario provare a larghezze di alcuni termini di ricerca, ma non essere tentati di abbreviare ("versione wmi SP" non forniscono risultati molto utili).Provare a termini alternativi.Ad esempio, ciò che è possibile chiamare "patch, "altri chiamare "gli aggiornamenti rapidi" e comunque altri chiamare" rapida fix Engineering" o le patch qfe. Cerca tutti questi termini potrebbe essere necessario per trovare risultati a destra.

Se si ricercano in un'operazione relativi all'hardware computer o di base del sistema operativo Windows, aggiungere "Win32" la frase di ricerca consente, poiché la maggior parte delle classi WMI rilevanti iniziano con un prefisso "Win32_".Aggiungere "Win32" mia ricerca corrente, viene generato in modo definito i migliori risultati.È possibile visualizzare diversi risultati con "Win32_OperatingSystem" nei titoli, è un nome di classe WMI.

A questo punto, il trucco importante è non facendo clic su uno dei risultati della ricerca.In questo modo consiste madness. Prima si desidera trovare le pagine documentazione corrente per la classe, pertanto è possibile ricominciare una nuova ricerca utilizzando solo il nome di classe che HO scoperto.In questo modo in genere consente di ottenere un collegamento per ilmsdn.microsoft.comSito Web la prima coppia di risultati e che deve consentono di accedere a piuttosto direttamente alla pagina della documentazione di classe.

La figura 1 mostra una parte di tale pagina.È stato eseguito lo scorrimento in una tabella in tale pagina, che elenca le versioni del sistema operativo con cui la classe funziona particolarmente importante.È possibile non indicato quante volte È stato labored su, tenta di ottenere per l'utilizzo, solo per scoprire che ciò che stava tentando si non effettivamente presente nella versione di Windows stava utilizzando.A questo punto si dispone di mouse del primo controllo in questa tabella.

fig01.gif

Nella figura 1 ricerca delle informazioni relative alla classe WMI fare clic su Immagine per una visualizzazione ingrandita

Lo scorrimento verso l'alto la pagina un po', verificare che esistono due proprietà che desidero: BuildNumber e ServicePack­MajorVersion.Infatti, ServicePackMinorVersion può risultare utile, inoltre, anche se non è visto un numero di 2.1 service pack di Microsoft.Ciò nonostante, associare probabilmente da controllare se solo da approfondita.

Cmdlet del mese: CliXML di esportazione e importazione CliXML

Windows PowerShell è in grado archiviare uno snapshot statico di oggetti in un formato XML speciale, che consente le informazioni in tali oggetti da mantenere in un file e caricato in memoria per analisi successive.È possibile semplicemente pipe oggetti Esporta-CliXML per salvare gli oggetti in un file:

Get-Process | Export-CliXML c:\processes.xml

Quando si importano questi oggetti nella shell in un secondo momento, è possibile esaminare le solo come qualsiasi altro oggetto. Non si trovano "reale gli oggetti, ma si abilita ulteriori opzioni di report. Si supponga che è stata pianificata uno script che Esporta tutti i processi di un determinato server alle ore 3: 00. Quando alcune attività di manutenzione è in esecuzione. Quando si giunge al lavoro, è possibile caricare tali processi e quindi esaminare, ad esempio l'ordinamento sul consumo di memoria virtuale, in questo modo:

Import-CliXML c:\processes.xml | Sort VM -descending

Creazione di prototipi

Non si desidera passare qualsiasi ulteriore senza necessario che effettuare tali proprietà mi aspetto. Windows PowerShell semplifica eseguire questa operazione. È possibile avviare controllando queste informazioni dal computer locale:

Get-WmiObject Win32_OperatingSystem | Select
BuildNumber,ServicePackMajorVersion,ServicePack­MinorVersion

Bene, il numero di versione secondario è zero, che era modo previsto, in modo verrà dimenticare di è. Altre informazioni sono anche quali previsto, ovvero un numero di build dell'6001 per computer Windows Server 2008 e una versione del service pack 1.

Ora non un test simile in un computer remoto, che è possibile sapere sono un amministratore in:

Get-WmiObject Win32_OperatingSystem –computer Server2 | 
Select BuildNumber,ServicePackMajorVersion

Se tale test non funziona, È necessario interrompere e scoprire perché prima può continuare. Gli eventuali problemi probabile correlati a connettività, firewall o autorizzazioni che sono tutti rientra Windows PowerShell stesso. Dopo che È stato ottenuto tutto ciò che funziona correttamente, È possibile spostare al passaggio successivo in mio problema: come ottenere una serie di nomi di computer all'esterno di un file.

Leggere i nomi di computer

Se il mio elenco di nomi di computer è in un file di testo ed è presente una nome computer ogni riga, il più semplice per eseguire questa operazione consiste nell'utilizzare il cmdlet Get-Content. (Non fret se i nomi di computer non sono in un file di testo o elencati uno per riga, verranno coprire le tecniche per gestire situazioni diverse in una colonna di completamento.)

Ogni nome viene restituito come un oggetto stringa indipendente. E una funzionalità utile di Get-WmiObjectcmdlet è che il parametro –computerName accetta un insieme di nomi di computer, in modo che questo dovrebbe risolvere il problema:

$names = Get-Content c:\computernames.txt
Get-WmiObject Win32_OperatingSystem –comp $names | Select
BuildNumber,ServicePackMajorVersion

Il problema ora è il tipo di output un elenco di numeri con alcuna indicazione di che consente di spostarsi numeri con il computer. Fortunatamente, la classe Win32_OperatingSystem avviene affinché un'altra proprietà, CSName che include il nome computer. In modo che È possibile aggiungere tale proprietà a mio output e viene visualizzato un inventario interessante:

$names = Get-Content c:\computernames.txt
Get-WmiObject Win32_OperatingSystem –comp $names | Select
CSName,BuildNumber,ServicePackMajorVersion

Modularizing

Tutto ciò potrebbe essere un po'troppo per un tecnico meno esperto utilizzare, il passaggio finale consiste di tutto ciò modulare in una funzione. Un metodo è per scrivere una funzione che accetta un nome di file e hanno la funzione eseguire tutte le operazioni:

Function Get-SPInventory ([string]$filename) {
  $names = Get-Content $filename
  Get-WmiObject Win32_OperatingSystem –comp  $names | Select   CSName,BuildNumber,ServicePackMajorVersion
}

Come può notare, semplicemente è incluso il codice di lavoro in una funzione denominata SPInventory Get. SONO stati definiti con un parametro di input denominato $ filename, pertanto può essere chiamato solo simile al seguente:

Get-SPInventory c:\computernames.txt

I risultati ancora possono essere reindirizzati a un file con estensione CSV, convertito in codice HTML e formattato in modo diverso, utilizzando i comandi di Windows PowerShell normali, in questo modo:

Get-SPInventory c:\computernames.txt | 
Export-CSV SPInventory.csv

Questa operazione non ancora è ideale, anche se. Se è possibile inoltre volessero in magazzino alcune informazioni non incluse nella classe Win32_OperatingSystem, quali il numero di serie BIOS per ogni computer Sarebbe utile poiché molti database di gestione configurazione (CMDBs) il BIOS serie numero utilizzato come identificatore univoco per computer.

Inoltre possibile l'output della funzione da un po'più flessibile, consentendo ad esempio per ordinare o filtrare i risultati più facilmente. Quindi, ad esempio, È possibile scegliere di includere solo i computer Windows Server 2003 con una versione meno recente del service pack nell'output finale per creare un elenco di computer, che È necessario aggiornare.

Funzioni di pipeline

Ora desidera riscrivere la funzione da un lettore migliore nella pipeline di Windows PowerShell. In particolare, desidera la funzione direttamente accettare i nomi dei computer dalla pipeline, in questo modo, È possibile decidere dove è possibile ottenere i nomi di computer da ogni volta che è possibile utilizzare la funzione. I nomi di computer potrebbero essere in un file o potrebbero essere in Active Directory e desidera la funzione anche entrambi funzionamento. Pertanto, ecco la funzione riscritta per la pipeline:

Function Get-SPInventory {
  PROCESS {
    $wmi = Get-WmiObject Win32_OperatingSystem       –comp $_ | Select     CSName,BuildNumber,ServicePackMajorVersion
    Write-Output $wmi
  }
}

Questo tipo speciale di funzione utilizza un blocco di script PROCESS, che verrà eseguita una volta per ogni oggetto pipeline pipe nella funzione. (I lettori dedicati verranno ricordare discusso il blocco di script PROCESS Nella dispensa 2008 luglio di questo articolo, disponibile in technet.microsoft.com/Magazine/cc644947.aspx.) La variabile $ _ speciale verrà inserita automaticamente con la pipeline di input, purché sono inviando nei nomi di computer, verrà funzionare correttamente. Viene utilizzata la nuova funzione simile al seguente:

Get-Content c:\computernames.txt | Get-SPInventory

Come può notare, questo offre maggiore flessibilità per ottenere i nomi dei computer da origini diverse. È possibile sostituire solo la parte di Get-Content del comando con qualsiasi comando è necessario recuperare i nomi di computer. Si noti che È stato impostato anche in modo che possano creare output più affidabile eseguendo diverse classi WMI (o altre origini dati) prima della creazione il output.

Ma che non fine della discussione. Mese successivo È necessario espandere questa funzione per includere il numero di serie del BIOS nell'output del.

Don Jones è cofondatore di Concentrated relativo alle tecnologie e autore di numerosi libri IT. Leggere il suo settimanale suggerimenti di Windows PowerShell o contattarlo in www.ConcentratedTech.com.