Windows PowerShell Creazione di una migliore Inventory Tool

Don Jones

Contenuto

Gli oggetti sono sempre L'uguali
Output flessibile
Input flessibile
Gli errori?
Effettua questo Really utili

Nella dispensa precedente di questo articolo, HO creato una funzione Impossibile recuperare informazioni di magazzino di service pack da più computer remoti. Mentre questo è uno strumento molto pratico che può essere molto utile, ero anche il processo che utilizzato per sviluppare lo strumento importanza prioritaria. In questo aggiornamento, È necessario illustrare il processo di che utilizzo in modo che sia meglio fornire creare le proprie funzioni.

La funzione creato nella dispensa precedente è simile al seguente:

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

E qui come puoi utilizzare:

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

Questa procedura funziona anche se il file di testo include una nome computer per riga.

Un punto debole specifico di questa funzione è che è limitato a restituire dati da una singola classe WMI (Windows Management Instrumentation).Pertanto cosa succede se si inoltre desidera restituire il numero di serie del BIOS?

Gli oggetti sono sempre L'uguali

Il problema è che la funzione sta recuperando la classe Win32_OperatingSystem da WMI e semplicemente output tale oggetto.La classe Win32_OperatingSystem, come tutti gli oggetti, è fisso nei dati in esso contenuti, non includere un numero seriale del BIOS e non possibile.Purché semplicemente l'output Win32_OperatingSystem oggetti, è non possibile che il output includere mai un numero di serie.

Indipendentemente da quanto rummage intorno a in WMI, non sono disponibili una classe di solo oggetti che include i numeri di serie del BIOS e informazioni del pacchetto del servizio.Di conseguenza, la funzione non può semplicemente genera una classe WMI.Al contrario, È necessario per inviare un oggetto personalizzato che compongono in tempo reale come output, ovvero uno che contenga tutti i dati È necessario.

Per creare un nuovo oggetto vuoto senza proprietà, è possibile solo eseguire questo:

$obj = New-Object PSObject

Il nuovo oggetto viene memorizzato nella variabile obj di $ ed È possibile aggiungere qualsiasi dati desiderato. Dopo avere aggiunto tutti i dati, quindi diventerà l'output della funzione.

All'interno la funzione È stato recuperato le informazioni di Win32_OperatingSystem e viene memorizzati nella variabile wmi di $. Utilizzando le informazioni che è semplice come riferimento a proprietà di $ wmi. Ad esempio, per ottenere la proprietà BuildNumber, utilizzerebbe questo:

$wmi.BuildNumber

Per aggiungere una proprietà dell'oggetto personalizzato, È necessario pipe l'oggetto (ovvero in variabile obj di $) da membri di aggiungere. Stabilire membri aggiuntivi il tipo di proprietà che si desidera aggiungere sempre un NoteProperty, nome di proprietà che desidera aggiungere e il valore dalla proprietà sia, in questo modo:

$obj | Add-Member NoteProperty BuildNumber 
($wmi.BuildNumber)

È possibile eseguire questa operazione per il nome di sistema del computer e servizio nonché versione:

$obj | Add-Member NotePropertyCSName 
  ($wmi.CSName)
$obj | Add-Member NotePropertySPVersion 
  ($wmi.ServicePackMajorVersion)

Ritorno a capo che dei raccolti una nuova funzione (vedere la Figura 1 ). Si noti che È stata modificata la riga di output di scrittura di output l'oggetto personalizzato, anziché oggetto wmi originale $.

Figura 1 A oggetto personalizzato

Function Get-SPInventory {
  PROCESS {
    $wmi = Get-WmiObject Win32_       OperatingSystem –comp $_ | 
       Select CSName,BuildNumber,ServicePack         MajorVersion
    $obj = New-Object PSObject
    $obj | Add-Member NoteProperty 
      BuildNumber ($wmi.BuildNumber)
    $obj | Add-Member NoteProperty CSName      ($wmi.CSName) 
    $obj | Add-Member NoteProperty SPVersion 
      ($wmi.ServicePackMajorVersion)
    Write-Output $obj
  }
}

A questo punto È necessario ottenere tale numero di serie del BIOS. Alcuni ricerca attiva la classe Win32_BIOS, che dispone di una proprietà Serial­Number ( Figura 2 mostra una parte della pagina documentazione in linea). Pertanto semplicemente necessario query la classe Win32_BIOS, aggiungere la proprietà Serial­Number dell'oggetto personalizzato e sono eseguita. È possibile vedere la funzione modificata nella Figura 3 .

fig02.gif

Nella figura 2 pagina della documentazione della classe Win32_BIOS fare clic su Immagine per una visualizzazione ingrandita

Proprietà SerialNumber con nella figura 3

Function Get-SPInventory {
  PROCESS {
    $wmi = Get-WmiObject Win32_      OperatingSystem –comp $_ |    
      Select CSName,BuildNumber,ServicePack        MajorVersion
    $obj = New-Object PSObject
    $obj | Add-Member NoteProperty 
      BuildNumber ($wmi.BuildNumber)
    $obj | Add-Member NoteProperty CSName      ($wmi.CSName)
    $obj | Add-Member NoteProperty SPVersion 
      ($wmi.ServicePackMajorVersion)

    $wmi = Get-WmiObject Win32_BIOS –comp $_ | 
      Select SerialNumber
    $obj | Add-Member NoteProperty BIOSSerial 
      ($wmi.SerialNumber)
    Write-Output $obj
  }
}

Output flessibile

Utilizzando un oggetto personalizzato per l'output, HO creato numerose potenziale utilizzo di questa funzione. Ad esempio, per includere solo i computer Windows Server 2008, È possibile utilizzare questo:

Gc c:\computernames.txt | Get-SPInventory | 
Where { $_.BuildNumber –eq 6001 }

In alternativa, per creare un file HTML contenente tutti i computer Windows Vista che non dispongono di Service Pack 1, È possibile utilizzare questo:

Gc c:\computernames.txt | Get-SPInventory | 
Where { $_.BuildNumber –eq 6000 } | 
ConvertTo-HTML | Out-File c:\VistaInventory.html

Le possibilità sono innumerevoli, XML, con estensione CSV, tabelle, elenchi, HTML, ordinati, filtrato, raggruppate e così via. Il cmdlet incorporato in Windows PowerShell consentono di utilizzare gli oggetti. Creando oggetti, per l'output, è possibile sfruttare i vantaggi di tutto ciò che Windows PowerShell è in grado di operazioni, senza lavoro aggiuntivo.

Input flessibile

La funzione non è purtroppo di flessibilità in termini di input. Parzialmente si tratta di una limitazione del come funzioni progettate nella versione 1 di Windows PowerShell, versione 2 verrà introdurre cmdlet di script, offrono una flessibilità molto maggiore.

La funzione è prevista la pipeline di input da oggetti stringa semplice. La funzione di non utilizzare se sostituisce il comando Get-Content con, ad esempio, un cmdlet per recuperare tutti i nomi di computer da Active Directory, simile al seguente:

Get-QADComputer | Get-SPInventory

In questo caso, il comando Get-QADComputer (parte di un insieme disponibile di cmdlet di gestione di Active Directory che è possibile ottenere in quest.com/powershell) è restituendo un oggetto dispone di una proprietà di nome, anziché restituire oggetti stringa semplice. Per rendere tale comando utilizzare, sarebbe necessario modificare la funzione, illustrata nella Figura 4 , è importante tenere presente che le modifiche sono evidenziate in rosso.

Nella figura 4 il prodotto finale

Function Get-SPInventory {
  PROCESS {
    $wmi = Get-WmiObject Win32_OperatingSystem –<span class="clsRed" xmlns="http://www.w3.org/1999/xhtml">comp 
    $_.Name</span> | Select 
      CSName,BuildNumber,
        ServicePackMajorVersion
    $obj = New-Object PSObject
    $obj | Add-Member NoteProperty 
      BuildNumber ($wmi.BuildNumber)
    $obj | Add-Member NoteProperty CSName 
      ($wmi.CSName)
    $obj | Add-Member NoteProperty SPVersion  
      ($wmi.ServicePackMajorVersion)

    $wmi = Get-WmiObject Win32_BIOS –comp <span class="clsRed" xmlns="http://www.w3.org/1999/xhtml">$_.Name |</span> 
      Select SerialNumber
    $obj | Add-Member NoteProperty BIOSSerial 
      ($wmi.SerialNumber)
    Write-Output $obj
  }
}

Anziché passando l'oggetto pipeline intera al parametro –computerName, la funzione viene ora utilizzato sulla proprietà Name dell'oggetto pipeline. Questa modifica secondaria è molto utile in termini di flessibilità, utilizzando QADComputer Get, riesco a limitare il input per computer in un'unità organizzativa specifica, ad esempio, o per solo tali computer sono corrispondenti altri criteri in base agli attributi Active Directory.

Gli errori?

Inevitabilmente, questa funzione infine verrà restituita in un computer che non è possibile connettersi a, non dispone dell'autorizzazione per connettersi o così via. La funzione, come attualmente vengono scritti, verrà visualizzato un messaggio di errore in rosso nella finestra della console Windows PowerShell e quindi continuare con il computer successivo.

Che, naturalmente, potrebbe essere solo ciò che si desidera eseguire. O è preferibile che la funzione per sopprimere i messaggi di errore. Questa è semplicemente aggiungendo questa riga l'inizio del blocco di script PROCESS la funzione:

$ErrorActionPreference = "SilentlyContinue"

Nuovo, si desideri adottare un approccio più complesso e creare un registro errori contenente i nomi dei computer che non raggiungibile. Windows PowerShell a tale scopo, ma è sarà necessario attendere il prossimo mese per vedere come eseguire questa operazione.

Cmdlet del mese: alias di esportazione E importazione-alias

Ecco una procedura semplifica notevolmente condividere alias personalizzato creato o la facilmente caricare ogni volta che la shell inizia l'alias personalizzati. Dopo aver creato tutti gli alias desiderato, esportarle in un file, simile al seguente:

Alias Export c:\aliases.xml

Per caricare tali alias nuovamente in della shell, eseguire questo comando:

Per l'importazione alias c:\aliases.xml

È possibile inserire tale comando secondo nello script profilo Windows PowerShell per esecuzione ogni volta che avvia la shell. Inoltre, è possibile inserire il file in rete per poter immediatamente disponibile per gli altri amministratori si lavora.

Effettua questo Really utili

Finora, si potrebbe avere stato digitando questa funzione in un file. ps1 e in cui viene eseguito lo script. Tutti i ben e buona, ma dispone alcuni problemi di usabilità. Un problema è che ogni volta che si desidera utilizzare la funzione che è necessario aprire tale file di script modifica la riga che chiama la funzione per aggiungere qualsiasi output, l'ordinamento o altri comandi che è necessario in quel momento), salvare lo script ed eseguirla. Sarebbe molto più semplice se la funzione stessa fosse disponibile a destra all'interno finestra della console della shell, quasi come un cmdlet.

Esistono due opzioni per passare su questa operazione. Il primo consiste nel copiare semplicemente la funzione in uno script del profilo di Windows PowerShell, uno dei quattro file di script che la shell eseguirà automaticamente (se esiste) ogni volta avvia. Singolo Start Guida installata con Windows PowerShell sono elencati i quattro percorsi.

In genere utilizzare il file è denominato profile.ps1 che deve essere memorizzato nella cartella denominata Windows­PowerShell (senza spazi) all'interno del documenti cartella (o documenti su computer Windows XP e Windows Server 2003). Una volta la funzione nel tuo profilo, verrà essere disponibile a destra dal prompt dei comandi ogni volta che è attiva la shell.

La seconda opzione consiste nell'includere la funzione, solo la funzione con nessun altro codice, in un'origine script e punto nella shell di script. In genere conseguenze eseguire uno script è che Windows PowerShell crea un nuovo ambito per lo script. Tutto ciò che passa nello script avviene nel tale ambito, ad esempio la definizione di funzioni. Al termine dell'esecuzione dello script, l'ambito viene eliminato e tutto ciò che ha cessato in tale ambito viene persa.

È importante tenere di conseguenza, presente che se si dispone un file di script contenente solo la funzione Get-SP­Inventory che eseguono script verrà creare un nuovo ambito, definire la funzione e ignorare l'ambito e quindi la funzione passerà stoccaggio. Ovviamente, non è molto utile.

Punto sourcing, invece, esegue uno script senza creare un nuovo ambito. Se È stato inserito SPInventory Get in un file denominato MyFunction.ps1, È possibile dot origine simile al seguente:

PS C:\> . c:\functions\myfunction

Nota Il periodo isolato, seguito da uno spazio che precede lo script percorso e il nome file. Che indica la shell per eseguire lo script nell'ambito corrente, ovvero tutto ciò che accade nello script verrà attenersi intorno a termine dell'esecuzione dello script. Il risultato è che lo script Get-SPInventory ora è definito nella shell e utilizzarlo direttamente dalla riga di comando quasi come se fosse un cmdlet.

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 ConcentratedTech.com.