Introduzione a PowerShell: il toolkit per amministratori di sistema
L'importanza degli amministratori di sistema nelle imprese non va sottovalutata: infatti solo con un'infrastruttura IT affidabile e costantemente funzionante un'azienda può raggiungere il massimo dell'efficienza economica. A seconda delle dimensioni dell'organizzazione, ciò richiede il monitoraggio e il controllo di decine, se non centinaia, di computer contemporaneamente. Un compito enorme che solo specialisti formati con una profonda conoscenza delle connessioni interne al sistema possono padroneggiare.
Se ora si verifica un problema con più computer contemporaneamente o se una nuova soluzione di sicurezza deve essere caricata sull'intera rete il più rapidamente possibile, non sarebbe né efficiente in termini di tempo né economico per un amministratore controllare ogni dispositivo singolarmente e ripetere sempre le stesse azioni. Windows PowerShell consente di velocizzare immensamente tali processi e di automatizzare il più possibile le attività di routine. Questo semplifica notevolmente il lavoro dell'amministratore di sistema. Scoprite nel nostro articolo che cosa può fare il software.
Che cos'è Windows PowerShell?
Windows PowerShell è, come suggerisce il nome, una cosiddetta “shell”. Nella tecnologia dell'informazione si intende un'interfaccia tra un computer e il suo utente. Il termine inglese “shell” significa “conchiglia”, ma è usato in senso figurato per descrivere un involucro esterno. Questo è anche il caso dell'informatica, dove il termine si riferisce all'interfaccia utente visibile attraverso la quale è possibile interagire con le funzioni interne al sistema di un computer.
Le shell sono generalmente orientate ai comandi e sono quindi controllate esclusivamente da tastiera e tramite l'immissione di testo. Sono quindi un'alternativa alle interfacce grafiche utente (GUI), che sono principalmente navigabili con il mouse, ad esempio tramite Windows Explorer. Dal momento che le shell forniscono anche un maggiore e più approfondito accesso alle funzioni e componenti di un PC, sono preferiti da molti professionisti IT e amministratori di sistema.
Perché esiste Windows PowerShell?
Fino a poco tempo fa, la riga di comando command.com e il prompt dei comandi cmd.exe erano le shell predefinite rispettivamente per i sistemi operativi DOS e Windows, che consentono agli utenti di computer avanzati di aprire le applicazioni della console, risolvere i problemi o navigare tra le unità di un PC. Ad esempio, il comando netstat può essere utilizzato per ottenere informazioni di base su tutte le attività di rete. Tuttavia, command.com e cmd.exe hanno sempre riscontrato due problemi: non tutti i componenti del sistema sono accessibili attraverso di essi e i loro linguaggi di scripting sono considerati di funzionalità limitata. Così, da qualche tempo ormai, sono state considerate non così sofisticate come le comuni shell Linux e Unix.
Gli sviluppatori di Microsoft avevano quindi pianificato di eliminare queste restrizioni a partire dagli anni 90. Nel corso del tempo hanno sviluppato varie shell con le quali hanno messo in pratica, più o meno bene, questo proposito. Monad, introdotto per la prima volta nel 2003 e ribattezzato PowerShell tre anni dopo, si è rivelato particolarmente innovativo.
I “Common Engineering Criteria” di Microsoft, secondo i quali tutti i prodotti server dell'azienda devono supportare PowerShell dal 2009, hanno trasformato PowerShell nella soluzione centrale di gestione e automazione in Windows. A partire da Windows 2008 è stato fornito opzionalmente con il sistema operativo, mentre nelle versioni successive è stato integrato come standard. Come framework open source è disponibile anche per il download per le versioni precedenti di Windows.
Nel 2016 si è deciso di offrire la shell indipendentemente dal sistema operativo. L'intenzione di Microsoft dietro tutto questo risiede nel fatto che in futuro PowerShell diventerà anche uno strumento universale per gli amministratori di sistema al di fuori di Windows, cioè su Linux e macOS. Da allora, PowerShell è diventato sempre più diffuso e conquista sempre nuovi sostenitori. Concludendo si può quindi affermare che PowerShell è il successore da tempo atteso del prompt dei comandi.
Cosa contraddistingue PowerShell rispetto al prompt dei comandi?
Ma in cosa differisce esattamente il familiare prompt dei comandi dal nuovo framework di Microsoft? In parole povere, PowerShell ha tutte le caratteristiche di cmd.exe, svolge meglio molte funzioni e compie altri processi che finora non erano possibili su Windows.
In linea di principio, PowerShell fornisce la stessa gamma di comandi di cmd.exe: fondamentalmente può essere utilizzato allo stesso modo del prompt dei comandi, disponendo di una sufficiente conoscenza dei comandi standard. Tuttavia, permette anche l'accesso più approfondito a processi interni di Windows, come il registro di sistema e la Windows Management Instrumentation (WMI), che prima non erano accessibili utilizzando cmd.exe. Inoltre, la riga di comando di Windows PowerShell segue la logica chiara di una struttura di comando e di una sintassi coerenti e in questo senso è creata in maniera più sensata rispetto a cmd.exe.
Un’altra caratteristica che contraddistingue particolarmente Windows PowerShell: a differenza del prompt dei comandi e dei sistemi Unix-like, il programma funziona completamente basato su oggetti invece di restituire i risultati dei comandi solo testualmente (strings). Ogni oggetto ha proprietà (properties) e metodi (methods) che specificano come può essere usato. Ad esempio, l'oggetto processo di Windows rappresenta proprietà quali nomi e ID di processo e metodi per la pausa e la terminazione dei processi.
Poiché i risultati dei comandi vengono sempre emessi come oggetti .NET, PowerShell può essere usato tramite pipeline per eseguire compiti molto più complessi di cmd.exe. Questo funziona utilizzando l'output di un oggetto nella pipe come input per l'oggetto successivo. Ad esempio, è possibile filtrare grandi e complesse quantità di dati per le estensioni dei file e formattarli in un elenco chiaro.
Windows PowerShell è più di una semplice riga di comando; è un ambiente di scripting completo e potente. È possibile scrivere i propri comandi o combinare più comandi in script complessi che semplificano le attività di gestione del sistema. Il remoting consente inoltre di eseguire script su un numero indefinito di sistemi contemporaneamente, indipendentemente dalla posizione, e quindi di gestirli, configurarli, rilevarli e ripararli.
Questa varietà di opzioni e funzioni rivela anche qual è il principale target di Windows PowerShell, cioè professionisti IT e amministratori di sistema che hanno una conoscenza approfondita della gestione delle shell e sono disposti a imparare Windows PowerShell per ottenere una maggiore efficienza. Per gli utenti che lavorano principalmente con l'interfaccia grafica di Windows e utilizzano solo sporadicamente il prompt dei comandi, PowerShell non offre alcun particolare valore aggiunto, soprattutto perché i tempi di familiarizzazione sono piuttosto lunghi.
Di seguito riassumiamo nuovamente in maniera chiara i vantaggi e gli svantaggi di Windows PowerShell rispetto al prompt dei comandi:
I vantaggi di PowerShell | Gli svantaggi di PowerShell |
---|---|
Disponibili tutti i comandi del prompt dei comandi | Apprendimento lungo e complesso |
Accesso approfondito ai processi interni di Windows come il registro di sistema e la WMI | Si rivolge principalmente ai professionisti IT e agli amministratori di sistema |
Uso più efficiente grazie a una struttura dei comandi e a una sintassi più consistente | Nessun uso aumentato per gli utenti della GUI che accedono al prompt dei comandi solo raramente |
L’orientamento completo agli oggetti consente l'esecuzione di compiti più complessi tramite pipeline | Necessario un certo tempo di adattamento |
L'ampio ambiente di scripting consente l'automazione efficiente dei processi | |
Amministrazione indipendente dal luogo di sistemi multipli tramite sistema remoto. |
Come funziona Windows PowerShell?
PowerShell consta essenzialmente di due parti, il PowerShell Engine e il PowerShell Scripting Language. Entrambi possono essere usati separatamente o in combinazione per ottenere il massimo dal programma.
Il PowerShell Engine
L'interprete a riga di comando (in inglese “command-line interpreter”, abbreviato in CLI) di PowerShell consente all'utente di accedere alle funzioni interne del sistema operativo tramite input da tastiera. I comandi corrispondenti del programma sono chiamati “cmdlets” (pronunciati “commandlets”, che significa approssimativamente “piccoli comandi”). Secondo una sintassi coerente, sono sempre composti da un verbo e un sostantivo al singolare, per esempio, Stop-Process o Sort-Object. I parametri sono specificati in un cmdlet secondo la formula -Parametro [Valore], per esempio:
Get-EventLog System Newest 3 (per richiamare le voci più nuove nel registro degli eventi del sistema)
Su PowerShell è consuetudine indicare i comandi con le lettere iniziali maiuscole, anche se funzionano ugualmente scrivendo tutto minuscolo.
Gli oltre 100 cmdlets principali includono anche i comandi standard usati frequentemente dal prompt dei comandi, che sono disponibili, tra gli altri, come alias, e sono destinati a rendere più facile per gli utenti iniziare a muovere i primi passi con la nuova shell. Per esempio, il comando cd usato per spostarsi in una directory ha il suo equivalente in Set-Location, che esegue esattamente la stessa funzione. Tutti gli alias già pronti possono essere visualizzati con il cmdlet Get-Alias. È inoltre possibile utilizzare il cmdlet Set-Alias per creare propri alias. Ad esempio, si utilizza la seguente pipe per assegnare l'alias “ed” al comando “notepad” (per il programma Notepad) in modo da non dover digitare tante volte per eseguire il programma:
Set-Alias ed notepad (per aprire Notepad con il comando ed)
Set-Alias scr1 C:\Users\IEUser\Desktop\script1.ps1 (per avviare uno script con l’abbreviazione scr1)
La seguente tabella comprende alcuni esempi di cmdlets frequenti e i rispettivi alias:
Alias | Cmdlet | Funzione |
---|---|---|
cd | Set-Location | Spostarsi nella cartella corrente |
dir | Get-ChildItem | Elencare tutti gli elementi di una cartella |
gi | Get-Item | Richiamare un elemento determinato |
ps | Get-Process | Elencare tutti i processi |
gsv | Get-Service | Elencare tutti i servizi installati |
gm | Get-Member | Indicare tutte le proprietà e i metodi di un oggetto |
clear | Clear-Host | Svuotare l’host PowerShell |
La struttura dei comandi di PowerShell, rigida ma facile da capire, consente di lavorare in modo più efficiente rispetto al prompt dei comandi. Si può guadagnare ancora più tempo con l'opzione di completamento automatico con il tasto [Tab] dei cmdlets scritti a metà. In molti casi, il programma rileva anche comandi digitati in modo incompleto.
I cmdlets si possono eseguire singolarmente o anche collegare tramite pipeline in modo che l'output di un oggetto possa essere letto e riutilizzato dall’oggetto seguente. Per aggiungere due cmdlets nella stessa pipeline, è sufficiente utilizzare il simbolo “|” [pipe o barra verticale]. In questo modo, ad esempio, è possibile elencare tutti i processi disponibili e ordinarli contemporaneamente per ID:
Get-Process | Sort-Object ID
Le variabili sono definite con il simbolo $. Come di consueto, possono essere utilizzati per memorizzare gli output per essere recuperate in un secondo momento durante il processo di pipeline. Questo permette a PowerShell di memorizzare i risultati di più comandi contemporaneamente tramite una pipeline, per esempio:
$a = (Get-Process | Sort-Object ID)
Il linguaggio di scripting di PowerShell
Gran parte del linguaggio di scripting di PowerShell potrà sembrare familiare da C# e altri linguaggi di scripting. Non solo lo si può utilizzare per scrivere i propri cmdlets (e condividerli con altri utenti se necessario), ma anche per impacchettare più comandi di fila in un file di script .ps1 per estendere le funzionalità della shell. Sono possibili numerosi esempi applicativi: dall'esecuzione di semplici operazioni di routine all’automazione quasi completa dei processi di monitoraggio e controllo. Gli script contengono sempre una descrizione dell'applicazione e vengono eseguiti con il prefisso "." seguito dal percorso completo del file. Un esempio:
.C:\Users\IEUser\Desktop\script1.ps1
Quali sono i contesti di utilizzo tipici di PowerShell?
A condizione che si abbia sufficiente pratica e competenza, PowerShell può rendere molte attività di amministrazione di sistema molto più efficienti. Di seguito sono riportati quattro esempi tipici di applicazione.
Organizzazione delle directory: rinominare più file contemporaneamente
Supponiamo di dover rinominare circa 1.000 documenti dello schema Testo (1).docx, Testo(2).docx, ecc. in modo che gli spazi nel nome del file siano sostituiti da trattini bassi: in questo caso non sarebbe consigliabile agire su ogni documento singolarmente. Invece, probabilmente si utilizzerebbe cmd.exe o, meglio ancora, uno strumento esterno. Il processo di pipeline in PowerShell consente una flessibilità ancora maggiore quando si rinominano grandi quantità di dati.
Per fare questo, andate prima nella directory in cui si trovano i documenti. È possibile farlo facilmente con il cmdlet Set-Location in combinazione con il percorso completo del file. Di seguito un esempio:
Set-Location C:\Users\IEUser\Desktop\Text folder
In alternativa è possibile utilizzare Windows Explorer per navigare fino alla directory appropriata, fare clic sulla barra dei percorsi e digitare powershell per aprire una finestra PowerShell per la directory. Con il seguente cmdlet rinominate i documenti selezionati:
Get-ChildItem *docx | Rename-Item -NewName {$_.name -replace " ","_"}
Per dare una migliore spiegazione: Get-ChildItem elenca tutti i file contenuti nella directory. Con l'aggiunta di *docx vengono filtrati solo i documenti Word con il formato corrispondente, quindi i documenti PDF che si trovano nella cartella non verrebbero presi in considerazione. Con il simbolo | si aggiunge un altro comando alla pipeline, cioè Rename-Item, che indica che qualcosa deve essere rinominato. -NewName specifica il nuovo nome utilizzando un blocco di script che funziona con la variabile $_.name, la quale rappresenta l'oggetto corrente. Mentre .name è la proprietà con il nome del file. Infine, utilizzate il parametro -replace per specificare che tutti gli spazi devono essere convertiti in trattini bassi.
Acquisizione dati: controllo dell'esecuzione dei servizi su PC
Prima di implementare una nuova soluzione di sicurezza sulla rete, è necessario verificare quali servizi sono già installati su un determinato PC. Lo strumento di base è il cmdlet Get-Service, che elenca tutti i servizi. Le funzioni di filtraggio di PowerShell consentono inoltre di visualizzare solo un sottoinsieme dei risultati, ad esempio tutti i servizi in esecuzione. Questo funziona con i seguenti cmdlets:
Get-Service | Where-Object {$_.status -eq "running"}
L'output di Get-Service viene inoltrato tramite pipeline al cmdlet Where-Object. Where-Object filtra tutti i servizi in base al loro stato (rappresentato dalla variabile $_.status e dal parametro -eq "running") ed elenca i servizi in esecuzione. È inoltre possibile ordinare l'elenco prefiltrato per nome visualizzato, se necessario, aggiungendo un altro cmdlet alla pipeline:
Get-Service | Where-Object {$_.status -eq "running"} | Sort-Object DisplayName
Con l’aggiunta della pipeline more si può anche strutturare diversamente la lunga lista dei servizi, di modo che si possa sfogliare pagina per pagina.
Risoluzione dei problemi: ricerca di errori di sistema nel registro eventi
I registri eventi (in inglese event logs) forniscono agli amministratori di sistema informazioni sui messaggi di errore nelle applicazioni, nel sistema operativo o nelle funzioni di sicurezza di un dispositivo. Con il comando Get-EventLog potete visualizzare e gestire questi registri. Ad esempio, se si desidera visualizzare i messaggi di errore nel Visualizzatore eventi di sistema, digitate quanto segue:
Get-EventLog System | Where-Object {$_.entryType -Match "Error"}
Se PowerShell restituisce troppi risultati facendovi perdere la visione d'insieme, è possibile utilizzare il parametro -Newest 100 per limitare l'elenco alle 100 voci del registro di sistema più recentemente inserite, che vengono poi filtrate in base agli errori:
Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} | Format-List
Per informazioni dettagliate sui singoli messaggi di errore, inoltrate l'output di questa pipeline al cmdlet Format-List:
Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} | Format-List
Manutenzione remota: controllare i servizi sui computer remoti
La Windows Management Instrumentation (WMI) fornisce l'accesso a quasi tutte le impostazioni e le funzioni dei computer Windows, diventando così lo strumento più importante per l'automazione dei processi e la manutenzione remota delle postazioni di lavoro digitali. È inoltre possibile utilizzare il cmdlet Get-WmiObject per i computer remoti, in modo da poter utilizzare anche Windows PowerShell come strumento di gestione del sistema. Per esempio, se avete bisogno di informazioni sulla classe Win32_BIOS su un computer in rete (rappresentata dal parametro -nomecomputer), il seguente comando vi aiuterà:
Get-WmiObject Win32_Bios -nomecomputer
In alternativa potete anche lavorare con il parametro –Class seguito dal percorso completo della classe:
Get-WmiObject -nomecomputer -Class Win32_Service
Ora è possibile accedere a distanza alle impostazioni di sistema interne del computer esterno. L'esempio seguente illustra come recuperare i metodi del servizio Windows Update Client per scoprire quali cmdlets possono essere utilizzati per avviarlo, arrestarlo e riavviarlo:
Get-WmiObject -nomecomputer -Class Win32_Service -Filter "Name='wuauserv'"
Come si può vedere, Get-WmiObject –nomecomputer mira prima di tutto al computer desiderato e poi seleziona la classe Win32_Service usando il parametro -Class. Il Windows Update Client con l'abbreviazione wuauserv viene quindi filtrato dai servizi esistenti. Con il cmdlet Get-Member, già presentato, e il parametro -Type Method si ottiene una panoramica di tutti i metodi per wuauserv che consentono di controllare il client a distanza:
Get-WmiObject -nomecomputer -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method