Stai lottando per trovare il modulo PowerShell perfetto per il tuo scenario unico? Con migliaia di moduli disponibili, potresti sentirti tentato di accontentarti di ciò che c’è. Beh, questo potrebbe lasciare la tua soluzione incompleta o inefficiente. Perché non iniziare a creare moduli invece?
Questa guida ti accompagnerà nella creazione di moduli per costruire soluzioni robuste e riutilizzabili personalizzate alle tue esigenze.
Trasforma i tuoi script in potenti blocchi di costruzione riutilizzabili su diversi progetti!
Creazione di un Modulo di Inventario dei Computer
In questa guida, creeremo un modulo PowerShell per raccogliere informazioni sull’hardware del computer. Questo modulo aiuterà gli amministratori di sistema a raccogliere e segnalare informazioni sulla memoria, lo storage e i dettagli del processore su più sistemi.
Il nostro modulo includerà:
- Funzioni per raccogliere informazioni specifiche sull’hardware
- Supporto per sistemi remoti utilizzando sessioni PowerShell
- Formato di output standardizzato per segnalazioni coerenti
Questo esempio pratico dimostra concetti essenziali dello sviluppo di moduli mentre si crea uno strumento utile per l’amministrazione di sistema.
Configurazione del Modulo PowerShell
Gestire i tuoi script su più sistemi può rapidamente diventare caotico. Ma quando i tuoi flussi di lavoro diventano una battaglia in salita, i moduli PowerShell sono utili. Un modulo è un modo strutturato per raggruppare e riutilizzare script per risparmiare tempo e ridurre gli errori.
Uniamo i concetti chiave per costruire un modulo PowerShell.
Inizia creando la directory del modulo e definendo il modulo stesso per organizzare il tuo lavoro.
## Create the module directory in the all-user location mkdir 'C:\Program Files\PowerShell\Modules\ComputerInventory' ## Create the module to hold the module functions Set-Content -Path 'C:\Program Files\PowerShell\Modules\ComputerInventory\ComputerInventory.psm1' -Value ''
Il comando Set-Content
crea un modulo chiamato ComputerInventory
nel percorso per tutti gli utenti. Questa posizione è stata scelta perché rende il modulo accessibile a chiunque acceda alla macchina, il che è cruciale negli ambienti aziendali in cui più utenti hanno bisogno di accedere alla stessa funzionalità di PowerShell. A differenza delle posizioni specifiche degli utenti, questo percorso centralizzato garantisce una disponibilità costante del modulo e una gestione più semplice dell’intero sistema.
Verificare la disponibilità del modulo:
## The module is already showing up as available Get-Module ComputerInventory -ListAvailable
Sebbene attualmente sia solo una shell, ciò conferma che verrà caricato correttamente in seguito.
Funzioni di Impalcatura
Un modulo ben strutturato è fondamentale, ma ciò che contiene lo rende veramente utile. Evita di perdere tempo a capire cosa fa ogni parte anziché essere produttivo creando l’impalcatura per le funzioni del tuo modulo.
Apri il modulo in un editor di testo come VS Code, quindi crea le funzioni di impalcatura.
Inizia creando funzioni segnaposto con nomi descrittivi.
function Get-MemoryInfo { [CmdletBinding()] param() } function Get-StorageInfo { [CmdletBinding()] param() } function Get-ProcessorInfo { [CmdletBinding()] param() }
I nomi delle funzioni seguono una convenzione di denominazione costante verbo-sostantivo.
I nomi delle funzioni in PowerShell seguono una convenzione di denominazione verbo-sostantivo, che è un modello di denominazione standardizzato. In questo caso, le funzioni sono chiamate:
- Get-MemoryInfo
- Get-StorageInfo
- Get-ProcessorInfo
Ogni nome di funzione inizia con il verbo “Get” (indicando che recupera informazioni) seguito da un sostantivo che descrive le informazioni che recupera (Memory, Storage o Processor).
Questa convenzione di denominazione è importante in PowerShell perché rende le funzioni prevedibili e più facili da capire: gli utenti possono rapidamente comprendere cosa fa una funzione solo guardando il suo nome.
Verifica la loro esistenza eseguendo quanto segue:
Get-Command -Module ComputerInventory
Quando esegui il comando Get-Command -Module ComputerInventory
, vedrai un output simile a questo:
CommandType Name Version Source ----------- ---- ------- ------ Function Get-MemoryInfo 1.0.0 ComputerInventory Function Get-ProcessorInfo 1.0.0 ComputerInventory Function Get-StorageInfo 1.0.0 ComputerInventory
Questo comando elenca tutte le funzioni disponibili nel modulo ComputerInventory, che include le tre funzioni che abbiamo creato: Get-MemoryInfo, Get-StorageInfo e Get-ProcessorInfo.
A questo punto, il modulo include le strutture delle funzioni. Miglioriamo queste funzioni definendo un output coerente utilizzando oggetti personalizzati.
Output standardizzato con oggetti personalizzati
Gli output non coerenti tra script possono trasformare un compito semplice in un incubo di analisi dati e risoluzione dei problemi. Nello sviluppo professionale di PowerShell, garantire output coerenti è un pilastro dello scripting efficace.
Standardizzare l’output con oggetti personalizzati aiuta a mantenere la coerenza tra le funzioni.
Nello script seguente:
- Gli oggetti personalizzati includono le proprietà
ComputerName
,HardwareCategory
eInfo
. - La proprietà
HardwareCategory
raggruppa tipi di hardware simili eComputerName
è progettata per la scalabilità multi-computer.
function Get-MemoryInfo { [CmdletBinding()] param() $outObject = @{ 'ComputerName' = '' 'HardwareCategory' = 'Memory' 'Info' = $null } $outObject } function Get-StorageInfo { [CmdletBinding()] param() $outObject = @{ 'ComputerName' = '' 'HardwareCategory' = 'Storage' 'Info' = $null } $outObject } function Get-ProcessorInfo { [CmdletBinding()] param() $outObject = @{ 'ComputerName' = '' 'HardwareCategory' = 'Processor' 'Info' = $null } $outObject }
Per prima cosa, re-importiamo il modulo per assicurarci di avere l’ultima versione:
Import-Module ComputerInventory -Force
Ora puoi eseguire le funzioni per vedere il loro output:
PS> Get-MemoryInfo Name Value ---- ----- Info HardwareCategory Memory ComputerName PS> Get-StorageInfo Name Value ---- ----- Info HardwareCategory Storage ComputerName PS> Get-ProcessorInfo Name Value ---- ----- Info HardwareCategory Processor ComputerName
Ogni funzione restituisce una tabella hash con ComputerName e proprietà Info vuote, ma con le rispettive categorie hardware definite.
Aggiunta di un parametro Session per il supporto remoto
Immagina di dover eseguire i tuoi script su decine o addirittura centinaia di computer. Se ogni funzione richiedesse di specificare manualmente un nome computer, sarebbe scomodo e soggetto a errori. Fortunatamente, il PowerShell Remoting fornisce una soluzione.
Utilizza un parametro Session
anziché un parametro ComputerName
per sfruttare il PowerShell Remoting:
function Get-MemoryInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Memory' 'Info' = $null } $outObject } function Get-StorageInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Storage' 'Info' = $null } $outObject } function Get-ProcessorInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Processor' 'Info' = $null } $outObject }
Questo parametro garantisce flessibilità quando si passa a più sistemi.
Il parametro Session è progettato per utilizzare il PowerShell Remoting per eseguire comandi su computer remoti. Ecco cosa lo rende potente:
- È definito come un parametro obbligatorio che accetta un oggetto PSSession (specificamente di tipo System.Management.Automation.Runspaces.PSSession)
- Il parametro Session fornisce automaticamente il nome del computer tramite $Session.ComputerName, che viene popolato nell’oggetto di output
Questo approccio offre diversi vantaggi:
- Consente di scalare efficientemente quando si lavora con più sistemi
- Piuttosto che creare nuove connessioni per ciascun comando, è possibile riutilizzare la stessa sessione per operazioni multiple, il che è più efficiente rispetto all’istituzione di connessioni individuali per ciascuna chiamata di funzione
- Puoi testare le funzioni creando un’unica PSSession e utilizzandola per tutte le funzioni di inventario, come mostrato nell’esempio in cui viene creata una sessione di test con: $testSession = New-PSSession -ComputerName SRV2
Salva e riesporta il modulo:
ipmo ComputerInventory -Force
Testare le Funzioni
Come puoi assicurarti che un modulo funzioni dopo averlo costruito? Il testing è essenziale per confermare che le funzioni del tuo modulo si comportino come previsto e restituiscano dati accurati. Saltare questo passaggio potrebbe portare a sorprese negli ambienti di produzione.
Stabilisci una sessione remota e testa il modulo:
$testSession = New-PSSession -ComputerName SRV2 Get-MemoryInfo -Session $testSession Get-StorageInfo -Session $testSession Get-ProcessorInfo -Session $testSession
Ogni funzione dovrebbe restituire un oggetto con le proprietà attese e il nome del computer corretto. Queste funzioni formano la base di uno strumento di inventario robusto.
Sulla base del codice mostrato, quando testi queste funzioni con una sessione remota, l’output apparirebbe simile a questo:
PS> $testSession = New-PSSession -ComputerName SRV2 PS> Get-MemoryInfo -Session $testSession Name Value ---- ----- Info HardwareCategory Memory ComputerName SRV2 PS> Get-StorageInfo -Session $testSession Name Value ---- ----- Info HardwareCategory Storage ComputerName SRV2 PS> Get-ProcessorInfo -Session $testSession Name Value ---- ----- Info HardwareCategory Processor ComputerName SRV2
Ogni funzione restituisce una hashtable contenente il nome del computer (dalla sessione), la categoria hardware specifica e un campo Info (attualmente nullo ma progettato per contenere le informazioni hardware effettive).
Conclusione
In questo articolo, hai appreso perché creare i tuoi moduli PowerShell è essenziale per affrontare sfide uniche che nessun modulo preconfezionato può risolvere. Abbiamo esplorato come i moduli personalizzati possano essere un cambiamento decisivo per configurazioni o processi specializzati all’interno del tuo ambiente.
Questo è solo l’inizio del nostro viaggio con il modulo ComputerInventory. Nei prossimi post del blog, amplieremo questa base aggiungendo capacità di raccolta di informazioni hardware reali, gestione degli errori e funzionalità avanzate di gestione remota.
Rimanete sintonizzati mentre trasformiamo questo framework di base in uno strumento potente per gli amministratori di sistema!
Source:
https://adamtheautomator.com/powershell-module-functions/