Crea sito
22 Ottobre 2020

Officine Informatiche Roma

ICT SERVICES ROMA – BAZAAR INFORMATICO

WINDOWS – Introduzione a PowerShell: il toolkit per amministratori di sistema

12 min read

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.

Indice

  1. Che cos’è Windows PowerShell?

  2. Perché esiste Windows PowerShell?

  3. Cosa contraddistingue PowerShell rispetto al prompt dei comandi?

  4. Come funziona Windows PowerShell?

  5. Quali sono i contesti di utilizzo tipici di PowerShell?

Di primo acchito Windows PowerShell assomiglia molto al prompt dei comandi, anche se presenta differenze sostanziali.

Finestra di Windows PowerShell

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.

Windows PowerShell nei risultati di ricerca di Esplora File

Windows PowerShell è preinstallato in tutte le versioni di Windows a partire dal 2008.

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) 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)

Risultati del cmdlet Get-Alias

Consiglio

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)

Con il cmdlet Get-Alias vengono mostrati tutti gli alias preimpostati di PowerShell.

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

Grazie al processo di pipeline Windows PowerShell può gestire anche incarichi complessi, ad esempio mostrare tutti i processi e ordinarli per 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).docxTesto(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:

Campo di input nel percorso di una cartella, in cui è stato inserito “powershell”

Set-Location C:\Users\IEUser\Desktop\Text folder

Inserendo il termine “powershell” nel percorso di una directory, aprite proprio in questa posizione una finestra PowerShell al posto di dover navigare fino a lì tramite input testuale.

In alternativa è possibile utilizzare Windows Explorer per navigare fino alla directory appropriatafare 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 qualerappresenta 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.

Risultato della denominazione di file tramite PowerShell

Avendo predefinito *docx come formato di file, il PDF viene escluso dalla denominazione.

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"}

Risultati della pipeline Get-Service| Where-Object {$_.status –eq "running"} | Sort-Object DisplayName

L’output di Get-Service viene inoltrato tramite pipeline al cmdlet Where-ObjectWhere-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

Grazie a funzioni di filtro di PowerShell si possono mostrare una gran quantità di sistemi installati su un sistema.

 Consiglio

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"}

Risultati della pipeline Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} e Format-List

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"}

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

Le grandi quantità di dati, ad esempio i registri degli eventi, possono essere accorciati e osservati meglio a seconda dei criteri selezionati.

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'"

Risultati della pipeline Get-WmiObject –nomecomputer -Class Win32_Service -Filter "Name='wuauserv'"

Con il cmdlet Get-WmiObject non si può accedere alle impostazioni interne e alle funzioni di un computer remoto, ma al proprio computer.

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

Risultato della pipeline Get-WmiObject –nomecomputer -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method

Il cmdlet Get-Member elenca tutte le proprietà e i metodi che sono disponibili per un oggetto .NET.

 

Translate »