Concatenare gli output dei cmdlet di Powershell

Accorpare gli output di Powershell per simulare ipconfig.
Utilizzando Powershell ci si rende spesso conto che per avere informazioni specifiche su un elemento del sistema è necessario ricorrere all’esecuzione di più cmdlet di tipo get, per poi leggere i risultati delle ricerche e metterli insieme per ricavare le informazioni necessarie.
La quasi totalità degli output è costituita da matrici associative (o hash table), ovvero delle strutture di dati, che possono essere accorpate e manipolate creando un oggetto con lo strumento PSCustomObject. Con questa scorciatoia è possibile creare un contenitore (matrice) con la struttura e le intestazioni di colonna desiderate, a cui assegnare i contenuti ottenuti dai cmdlet di interrogazione. L’utilizzo di matrici associative permette inoltre un rapido accesso ai contenuti.
L’utilizzo di PSCustomObject è possibile a partire da Powershell 3.0, si ricorda che per ragioni di sicurezza è opportuno avere installata l’ultima versione dell’applicazione Powershell.
Per fornire un’idea del come utilizzare gli output dei cmdlet e aggregarli in un nuovo oggetto partiamo da un esempio abbastanza articolato, che si pone come scopo quello di ottenere un output con contenuti simili a quelli del comando ipconfig /all, che nel caso di Powershell richiede più di cinque cmdlet.
Quando descritto è puramente didattico, anche se porta ad un risultato effettivo, lo scopo reale è quello di dare un’idea generale di come le matrici possano essere sfruttate per ottenere degli output di facile interpretazione dalla fusione di più output.
Raccogliere le informazioni della scheda di rete
La ricerca delle informazioni della scheda di rete attraverso Powershell richiede diversi cmdlet, ognuno dei quali restituisce le informazioni di un sottoinsieme di configurazioni.
Le informazioni necessarie possono essere recuperate da sei cmdlet, ne esistono tuttavia altre per ottenere informazioni su altri aspetti di configurazione della rete del computer.
Vediamo i cmdlet coinvolti in questo esperimento:
Get-NetAdapter | Where-Object { $_.Status -eq “Up” }
Fornisce il nome, la descrizione, lo stato, il MAC Address, la velocità del link e l’indice dell’interfaccia. La parametrizzazione del cmdlet restituisce solo le interfacce collegate e attive.
Get-NetIPAddress | Where-Object { $_.ifIndex -eq $Row.ifIndex -and $_.PrefixLength -ne “64”}
Fornisce diverse informazioni ed in particolare l’indirizzo IP associato alle interfacce con l’indice ottenuto dal primo cmdlet.
Get-NetIPInterface -AddressFamily IPv4 | Where-Object { $_.ifIndex -eq $Row.ifIndex }
Fornisce lo stato del DHCP per l’interfaccia con l’indice ottenuto, permette quindi di sapere se l’indirizzo è di tipo statico o ottenuto da un DHCP.
Get-CimInstance Win32_NetworkAdapterConfiguration -Filter “DHCPEnabled=$true” | Select DHCPServer
Fornisce l’indirizzo IP del DHCP server che ha configurato la scheda di rete attiva.
Get-NetRoute -InterfaceIndex $Row.ifIndex -AddressFamily IPv4 -RouteMetric 0 -ErrorAction:SilentlyContinue
Fornisce l’indirizzo del gateway di rete associato alla scheda di rete.
Get-DnsClientServerAddress -InterfaceIndex $Row.ifIndex -AddressFamily IPv4
Fornisce gli indirizzi dei DNS associati alla scheda di rete.
Le informazioni ottenibili dai cmdlet citati sono molteplici e gli elementi utili per determinare la configurazione necessaria sono pochi per ogni comando, appare chiaro che la metodologia di indagine con Powershell è abbastanza scomoda.
Ottenere le informazioni necessarie con le matrici associative
L’obiettivo è quello di sfruttare le diverse matrici di output per ottenerne una sola con le informazioni utili, il meccanismo è abbastanza semplice, ma lo abbiamo calato in un esempio complesso per fornire una percezione immediata della potenzialità del metodo di accorpamento.
Il valore che collega tra loro quasi tutti i cmdlet è il parametro ifIndex, che è ottenibile dal output del cmdlet Get-NetAdapter (Riga 1).
Le schede di rete presenti possono essere molteplici e possono essere filtrate con specifiche condizioni di ricerca, per ottenere i dati ogni singola interfaccia è necessario leggere i dati di ogni singola scheda usando il cmdlet foreach (Riga 5), entro il quale si inseriranno gli ulteriori cmdlet per la raccolta delle ulteriori informazioni su ogni singola interfaccia.
Prima di iniziare l’analisi deve essere inizializzato l’oggetto matrice che raccoglierà i dati (Riga 3).
$NetInfo = @()
All’interno del ciclo trovano posto i diversi cmdlet, associati ad una variabile (Righe 6-10).
A questo punto lo script dispone di tutte le informazioni necessarie sulla scheda di rete, pronte per essere immagazzinate nella matrice inizializzata.
La struttura della matrice ed i valori associati sono salvati (Righe 11-23) usando il seguente metodo:
$NetInfo += [pscustomobject] @{
…..
}
L’operatore += aggiunge i nuovi valori ai valori precedentemente salvati ($NetInfo = $NetInfo + $Valore), nel caso specifico è equivalente a creare un nuovo record di dati.
Con il metodo [pscustomobject] è possibile, tra le tante opzioni, creare una matrice associativa con delle intestazioni di colonna personalizzate ai quali associare i parametri ottenuti da altre fonti.
Name = $Row.Name
Description = $Row.InterfaceDescription
ifIndex = $Row.ifIndex
….
Per associare i dati ottenuti è sufficiente leggere dal output del cmdlet corrispondente il valore di interesse, sfruttando il nome della sua intestazione di colonna: VariabileContenitore.NomeParametro.
Durante l’associazione è anche possibile formattare il valore per escludere delle parti inutili o per ottenere delle visualizzazioni più leggibili, come il convertire un valore ottenuto in byte in uno espresso in megabyte.
$Adapter = Get-NetAdapter | Where-Object { $_.Status -eq "Up" }
$NetInfo = @()
foreach ($Row in $Adapter) {
$Address = Get-NetIPAddress | Where-Object { $_.ifIndex -eq $Row.ifIndex -and $_.PrefixLength -ne "64"}
$DHCP = Get-NetIPInterface -AddressFamily IPv4 | Where-Object { $_.ifIndex -eq $Row.ifIndex }
$DHCPAddress = Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true" | Select DHCPServer
$Router = Get-NetRoute -InterfaceIndex $Row.ifIndex -AddressFamily IPv4 -RouteMetric 0 -ErrorAction:SilentlyContinue
$DNS = Get-DnsClientServerAddress -InterfaceIndex $Row.ifIndex -AddressFamily IPv4
$NetInfo += [pscustomobject] @{
Name = $Row.Name
Description = $Row.InterfaceDescription
ifIndex = $Row.ifIndex
MAC = $Row.MacAddress
Speed = $Row.LinkSpeed
IPAddress = $Address.IPAddress
Mask = $Address.PrefixLength
Gateway = $Router.NextHop
DNS = $DNS.ServerAddresses
DHCPStatus = $DHCP.Dhcp
DHCPAddress = $DHCPAddress.DHCPServer | Where-Object { $_ -ne $null }
}
}
$NetInfo
Per maggiori informazioni sull’uso e la realizzazione degli script di automazione leggi questo articolo e contattaci senza impegno.
I componenti distribuiti sono forniti senza alcuna garanzia. Non vi sono garanzie che il software soddisfi le vostre esigenze o sia esente da errori. In nessun caso gli sviluppatori saranno responsabili per eventuali danni.
I componenti proposti sono stati collaudati nel modo più esaustivo possibile e sono utilizzati in modo regolare in ambienti di produzione, durante il loro utilizzo non si sono verificate anomalie di funzionamento.
Articoli recenti
- ShellBag – un viaggio allucinante nei ricordi di Windows
- La donazione di sangue nei cani: importanza, modalità e compatibilità
- Il Manto del Cane: Un Viaggio alla Scoperta della Sua Pelle e del Suo Pelo
- Proteggi il tuo cane dal caldo: prevenzione e riconoscimento della disidratazione
- Monitoraggio e Verifica delle Configurazioni di Rete: Una Soluzione Efficace con PowerShell e Datto RMM
Archivi
Prossimi eventi
Non ci sono eventi imminenti.
Iscriviti alla nostra Newsletter
Un progetto parallelo ambientato nella Tuscia Sutrina: piante da giardino locali, tecniche di coltivazione, storia e leggende del territorio, racconti fantasy a tema. Botanica, cultura e tradizioni in un unico spazio.
A volte basta una breve pausa per ritrovare la concentrazione: qualche minuto tra verde e fantasia può aiutare a tornare al lavoro con nuove idee.
Visita il sito
