L'im­por­tan­za degli am­mi­ni­stra­to­ri di sistema nelle imprese non va sot­to­va­lu­ta­ta: infatti solo con un'in­fra­strut­tu­ra IT af­fi­da­bi­le e co­stan­te­men­te fun­zio­nan­te un'a­zien­da può rag­giun­ge­re il massimo del­l'ef­fi­cien­za economica. A seconda delle di­men­sio­ni del­l'or­ga­niz­za­zio­ne, ciò richiede il mo­ni­to­rag­gio e il controllo di decine, se non centinaia, di computer con­tem­po­ra­nea­men­te. Un compito enorme che solo spe­cia­li­sti formati con una profonda co­no­scen­za delle con­nes­sio­ni interne al sistema possono pa­dro­neg­gia­re.

Se ora si verifica un problema con più computer con­tem­po­ra­nea­men­te o se una nuova soluzione di sicurezza deve essere caricata sul­l'in­te­ra rete il più ra­pi­da­men­te possibile, non sarebbe né ef­fi­cien­te in termini di tempo né economico per un am­mi­ni­stra­to­re con­trol­la­re ogni di­spo­si­ti­vo sin­go­lar­men­te e ripetere sempre le stesse azioni. Windows Po­wer­Shell consente di ve­lo­ciz­za­re im­men­sa­men­te tali processi e di au­to­ma­tiz­za­re il più possibile le attività di routine. Questo sem­pli­fi­ca no­te­vol­men­te il lavoro del­l'am­mi­ni­stra­to­re di sistema. Scoprite nel nostro articolo che cosa può fare il software.

Che cos'è Windows Po­wer­Shell?

Windows Po­wer­Shell è, come sug­ge­ri­sce il nome, una co­sid­det­ta “shell”. Nella tec­no­lo­gia del­l'in­for­ma­zio­ne si intende un'in­ter­fac­cia tra un computer e il suo utente. Il termine inglese “shell” significa “con­chi­glia”, ma è usato in senso figurato per de­scri­ve­re un involucro esterno. Questo è anche il caso del­l'in­for­ma­ti­ca, dove il termine si riferisce all'in­ter­fac­cia utente visibile at­tra­ver­so la quale è possibile in­te­ra­gi­re con le funzioni interne al sistema di un computer.

Le shell sono ge­ne­ral­men­te orientate ai comandi e sono quindi con­trol­la­te esclu­si­va­men­te da tastiera e tramite l'im­mis­sio­ne di testo. Sono quindi un'al­ter­na­ti­va alle in­ter­fac­ce grafiche utente (GUI), che sono prin­ci­pal­men­te na­vi­ga­bi­li con il mouse, ad esempio tramite Windows Explorer. Dal momento che le shell for­ni­sco­no anche un maggiore e più ap­pro­fon­di­to accesso alle funzioni e com­po­nen­ti di un PC, sono preferiti da molti pro­fes­sio­ni­sti IT e am­mi­ni­stra­to­ri di sistema.

Perché esiste Windows Po­wer­Shell?

Fino a poco tempo fa, la riga di comando command.com e il prompt dei comandi cmd.exe erano le shell pre­de­fi­ni­te ri­spet­ti­va­men­te per i sistemi operativi DOS e Windows, che con­sen­to­no agli utenti di computer avanzati di aprire le ap­pli­ca­zio­ni della console, risolvere i problemi o navigare tra le unità di un PC. Ad esempio, il comando netstat può essere uti­liz­za­to per ottenere in­for­ma­zio­ni di base su tutte le attività di rete. Tuttavia, command.com e cmd.exe hanno sempre ri­scon­tra­to due problemi: non tutti i com­po­nen­ti del sistema sono ac­ces­si­bi­li at­tra­ver­so di essi e i loro linguaggi di scripting sono con­si­de­ra­ti di fun­zio­na­li­tà limitata. Così, da qualche tempo ormai, sono state con­si­de­ra­te non così so­fi­sti­ca­te come le comuni shell Linux e Unix.

Gli svi­lup­pa­to­ri di Microsoft avevano quindi pia­ni­fi­ca­to di eliminare queste re­stri­zio­ni a partire dagli anni 90. Nel corso del tempo hanno svi­lup­pa­to varie shell con le quali hanno messo in pratica, più o meno bene, questo proposito. Monad, in­tro­dot­to per la prima volta nel 2003 e ri­bat­tez­za­to Po­wer­Shell tre anni dopo, si è rivelato par­ti­co­lar­men­te in­no­va­ti­vo.

I “Common En­gi­nee­ring Criteria” di Microsoft, secondo i quali tutti i prodotti server del­l'a­zien­da devono sup­por­ta­re Po­wer­Shell dal 2009, hanno tra­sfor­ma­to Po­wer­Shell nella soluzione centrale di gestione e au­to­ma­zio­ne in Windows. A partire da Windows 2008 è stato fornito op­zio­nal­men­te con il sistema operativo, mentre nelle versioni suc­ces­si­ve è stato integrato come standard. Come framework open source è di­spo­ni­bi­le anche per il download per le versioni pre­ce­den­ti di Windows.

Nel 2016 si è deciso di offrire la shell in­di­pen­den­te­men­te dal sistema operativo. L'in­ten­zio­ne di Microsoft dietro tutto questo risiede nel fatto che in futuro Po­wer­Shell diventerà anche uno strumento uni­ver­sa­le per gli am­mi­ni­stra­to­ri di sistema al di fuori di Windows, cioè su Linux e macOS. Da allora, Po­wer­Shell è diventato sempre più diffuso e conquista sempre nuovi so­ste­ni­to­ri. Con­clu­den­do si può quindi affermare che Po­wer­Shell è il suc­ces­so­re da tempo atteso del prompt dei comandi.

Cosa con­trad­di­stin­gue Po­wer­Shell rispetto al prompt dei comandi?

Ma in cosa dif­fe­ri­sce esat­ta­men­te il familiare prompt dei comandi dal nuovo framework di Microsoft? In parole povere, Po­wer­Shell ha tutte le ca­rat­te­ri­sti­che di cmd.exe, svolge meglio molte funzioni e compie altri processi che finora non erano possibili su Windows.

In linea di principio, Po­wer­Shell fornisce la stessa gamma di comandi di cmd.exe: fon­da­men­tal­men­te può essere uti­liz­za­to allo stesso modo del prompt dei comandi, di­spo­nen­do di una suf­fi­cien­te co­no­scen­za dei comandi standard. Tuttavia, permette anche l'accesso più ap­pro­fon­di­to a processi interni di Windows, come il registro di sistema e la Windows Ma­na­ge­ment In­stru­men­ta­tion (WMI), che prima non erano ac­ces­si­bi­li uti­liz­zan­do cmd.exe. Inoltre, la riga di comando di Windows Po­wer­Shell 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 ca­rat­te­ri­sti­ca che con­trad­di­stin­gue par­ti­co­lar­men­te Windows Po­wer­Shell: a dif­fe­ren­za del prompt dei comandi e dei sistemi Unix-like, il programma funziona com­ple­ta­men­te basato su oggetti invece di re­sti­tui­re i risultati dei comandi solo te­stual­men­te (strings). Ogni oggetto ha proprietà (pro­per­ties) e metodi (methods) che spe­ci­fi­ca­no come può essere usato. Ad esempio, l'oggetto processo di Windows rap­pre­sen­ta proprietà quali nomi e ID di processo e metodi per la pausa e la ter­mi­na­zio­ne dei processi.

Poiché i risultati dei comandi vengono sempre emessi come oggetti .NET, Po­wer­Shell può essere usato tramite pipeline per eseguire compiti molto più complessi di cmd.exe. Questo funziona uti­liz­zan­do l'output di un oggetto nella pipe come input per l'oggetto suc­ces­si­vo. Ad esempio, è possibile filtrare grandi e complesse quantità di dati per le esten­sio­ni dei file e for­mat­tar­li in un elenco chiaro.

Windows Po­wer­Shell è 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 sem­pli­fi­ca­no le attività di gestione del sistema. Il remoting consente inoltre di eseguire script su un numero in­de­fi­ni­to di sistemi con­tem­po­ra­nea­men­te, in­di­pen­den­te­men­te dalla posizione, e quindi di gestirli, con­fi­gu­rar­li, rilevarli e ripararli.

Questa varietà di opzioni e funzioni rivela anche qual è il prin­ci­pa­le target di Windows Po­wer­Shell, cioè pro­fes­sio­ni­sti IT e am­mi­ni­stra­to­ri di sistema che hanno una co­no­scen­za ap­pro­fon­di­ta della gestione delle shell e sono disposti a imparare Windows Po­wer­Shell per ottenere una maggiore ef­fi­cien­za. Per gli utenti che lavorano prin­ci­pal­men­te con l'in­ter­fac­cia grafica di Windows e uti­liz­za­no solo spo­ra­di­ca­men­te il prompt dei comandi, Po­wer­Shell non offre alcun par­ti­co­la­re valore aggiunto, so­prat­tut­to perché i tempi di fa­mi­lia­riz­za­zio­ne sono piuttosto lunghi.

Di seguito rias­su­mia­mo nuo­va­men­te in maniera chiara i vantaggi e gli svantaggi di Windows Po­wer­Shell rispetto al prompt dei comandi:

I vantaggi di Po­wer­Shell Gli svantaggi di Po­wer­Shell
Di­spo­ni­bi­li tutti i comandi del prompt dei comandi Ap­pren­di­men­to lungo e complesso
Accesso ap­pro­fon­di­to ai processi interni di Windows come il registro di sistema e la WMI Si rivolge prin­ci­pal­men­te ai pro­fes­sio­ni­sti IT e agli am­mi­ni­stra­to­ri di sistema
Uso più ef­fi­cien­te grazie a una struttura dei comandi e a una sintassi più con­si­sten­te Nessun uso aumentato per gli utenti della GUI che accedono al prompt dei comandi solo raramente
L’orien­ta­men­to completo agli oggetti consente l'e­se­cu­zio­ne di compiti più complessi tramite pipeline Ne­ces­sa­rio un certo tempo di adat­ta­men­to
L'ampio ambiente di scripting consente l'au­to­ma­zio­ne ef­fi­cien­te dei processi
Am­mi­ni­stra­zio­ne in­di­pen­den­te dal luogo di sistemi multipli tramite sistema remoto.

Come funziona Windows Po­wer­Shell?

Po­wer­Shell consta es­sen­zial­men­te di due parti, il Po­wer­Shell Engine e il Po­wer­Shell Scripting Language. Entrambi possono essere usati se­pa­ra­ta­men­te o in com­bi­na­zio­ne per ottenere il massimo dal programma.

Il Po­wer­Shell Engine

L'in­ter­pre­te a riga di comando (in inglese “command-line in­ter­pre­ter”, ab­bre­via­to in CLI) di Po­wer­Shell consente al­l'u­ten­te di accedere alle funzioni interne del sistema operativo tramite input da tastiera. I comandi cor­ri­spon­den­ti del programma sono chiamati “cmdlets” (pro­nun­cia­ti “com­mand­le­ts”, che significa ap­pros­si­ma­ti­va­men­te “piccoli comandi”). Secondo una sintassi coerente, sono sempre composti da un verbo e un so­stan­ti­vo al singolare, per esempio, Stop-Process o Sort-Object. I parametri sono spe­ci­fi­ca­ti 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)
Consiglio

Su Po­wer­Shell è con­sue­tu­di­ne indicare i comandi con le lettere iniziali maiuscole, anche se fun­zio­na­no ugual­men­te scrivendo tutto minuscolo.

Gli oltre 100 cmdlets prin­ci­pa­li includono anche i comandi standard usati fre­quen­te­men­te dal prompt dei comandi, che sono di­spo­ni­bi­li, 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 equi­va­len­te in Set-Location, che esegue esat­ta­men­te la stessa funzione. Tutti gli alias già pronti possono essere vi­sua­liz­za­ti con il cmdlet Get-Alias. È inoltre possibile uti­liz­za­re 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 ri­spet­ti­vi alias:

Alias Cmdlet Funzione
cd Set-Location Spostarsi nella cartella corrente
dir Get-ChildItem Elencare tutti gli elementi di una cartella
gi Get-Item Ri­chia­ma­re un elemento de­ter­mi­na­to
ps Get-Process Elencare tutti i processi
gsv Get-Service Elencare tutti i servizi in­stal­la­ti
gm Get-Member Indicare tutte le proprietà e i metodi di un oggetto
clear Clear-Host Svuotare l’host Po­wer­Shell

La struttura dei comandi di Po­wer­Shell, rigida ma facile da capire, consente di lavorare in modo più ef­fi­cien­te rispetto al prompt dei comandi. Si può gua­da­gna­re ancora più tempo con l'opzione di com­ple­ta­men­to au­to­ma­ti­co con il tasto [Tab] dei cmdlets scritti a metà. In molti casi, il programma rileva anche comandi digitati in modo in­com­ple­to.

I cmdlets si possono eseguire sin­go­lar­men­te o anche collegare tramite pipeline in modo che l'output di un oggetto possa essere letto e riu­ti­liz­za­to dall’oggetto seguente. Per ag­giun­ge­re due cmdlets nella stessa pipeline, è suf­fi­cien­te uti­liz­za­re il simbolo “|” [pipe o barra verticale]. In questo modo, ad esempio, è possibile elencare tutti i processi di­spo­ni­bi­li e ordinarli con­tem­po­ra­nea­men­te per ID:

Get-Process | Sort-Object ID

Le variabili sono definite con il simbolo $. Come di consueto, possono essere uti­liz­za­ti per me­mo­riz­za­re gli output per essere re­cu­pe­ra­te in un secondo momento durante il processo di pipeline. Questo permette a Po­wer­Shell di me­mo­riz­za­re i risultati di più comandi con­tem­po­ra­nea­men­te tramite una pipeline, per esempio:

$a = (Get-Process | Sort-Object ID)

Il lin­guag­gio di scripting di Po­wer­Shell

Gran parte del lin­guag­gio di scripting di Po­wer­Shell potrà sembrare familiare da C# e altri linguaggi di scripting. Non solo lo si può uti­liz­za­re per scrivere i propri cmdlets (e con­di­vi­der­li con altri utenti se ne­ces­sa­rio), ma anche per im­pac­chet­ta­re più comandi di fila in un file di script .ps1 per estendere le fun­zio­na­li­tà della shell. Sono possibili numerosi esempi ap­pli­ca­ti­vi: dal­l'e­se­cu­zio­ne di semplici ope­ra­zio­ni di routine all’au­to­ma­zio­ne quasi completa dei processi di mo­ni­to­rag­gio e controllo. Gli script con­ten­go­no sempre una de­scri­zio­ne del­l'ap­pli­ca­zio­ne 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 Po­wer­Shell?

A con­di­zio­ne che si abbia suf­fi­cien­te pratica e com­pe­ten­za, Po­wer­Shell può rendere molte attività di am­mi­ni­stra­zio­ne di sistema molto più ef­fi­cien­ti. Di seguito sono riportati quattro esempi tipici di ap­pli­ca­zio­ne.

Or­ga­niz­za­zio­ne delle directory: ri­no­mi­na­re più file con­tem­po­ra­nea­men­te

Sup­po­nia­mo di dover ri­no­mi­na­re circa 1.000 documenti dello schema Testo (1).docx, Testo(2).docx, ecc. in modo che gli spazi nel nome del file siano so­sti­tui­ti da trattini bassi: in questo caso non sarebbe con­si­glia­bi­le agire su ogni documento sin­go­lar­men­te. Invece, pro­ba­bil­men­te si uti­liz­ze­reb­be cmd.exe o, meglio ancora, uno strumento esterno. Il processo di pipeline in Po­wer­Shell consente una fles­si­bi­li­tà ancora maggiore quando si ri­no­mi­na­no grandi quantità di dati.

Per fare questo, andate prima nella directory in cui si trovano i documenti. È possibile farlo fa­cil­men­te con il cmdlet Set-Location in com­bi­na­zio­ne con il percorso completo del file. Di seguito un esempio:

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

In al­ter­na­ti­va è possibile uti­liz­za­re Windows Explorer per navigare fino alla directory ap­pro­pria­ta, fare clic sulla barra dei percorsi e digitare po­wer­shell per aprire una finestra Po­wer­Shell per la directory. Con il seguente cmdlet ri­no­mi­na­te i documenti se­le­zio­na­ti:

Get-ChildItem *docx | Rename-Item -NewName {$_.name -replace " ","_"}

Per dare una migliore spie­ga­zio­ne: Get-ChildItem elenca tutti i file contenuti nella directory. Con l'ag­giun­ta di *docx vengono filtrati solo i documenti Word con il formato cor­ri­spon­den­te, quindi i documenti PDF che si trovano nella cartella non ver­reb­be­ro presi in con­si­de­ra­zio­ne. Con il simbolo | si aggiunge un altro comando alla pipeline, cioè Rename-Item, che indica che qualcosa deve essere ri­no­mi­na­to. -NewName specifica il nuovo nome uti­liz­zan­do un blocco di script che funziona con la variabile $_.name, la quale rap­pre­sen­ta l'oggetto corrente. Mentre .name è la proprietà con il nome del file. Infine, uti­liz­za­te il parametro -replace per spe­ci­fi­ca­re che tutti gli spazi devono essere con­ver­ti­ti in trattini bassi.

Ac­qui­si­zio­ne dati: controllo del­l'e­se­cu­zio­ne dei servizi su PC

Prima di im­ple­men­ta­re una nuova soluzione di sicurezza sulla rete, è ne­ces­sa­rio ve­ri­fi­ca­re quali servizi sono già in­stal­la­ti su un de­ter­mi­na­to PC. Lo strumento di base è il cmdlet Get-Service, che elenca tutti i servizi. Le funzioni di fil­trag­gio di Po­wer­Shell con­sen­to­no inoltre di vi­sua­liz­za­re solo un sot­toin­sie­me dei risultati, ad esempio tutti i servizi in ese­cu­zio­ne. 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 (rap­pre­sen­ta­to dalla variabile $_.status e dal parametro -eq "running") ed elenca i servizi in ese­cu­zio­ne. È inoltre possibile ordinare l'elenco pre­fil­tra­to per nome vi­sua­liz­za­to, se ne­ces­sa­rio, ag­giun­gen­do un altro cmdlet alla pipeline:

Get-Service | Where-Object {$_.status -eq "running"} | Sort-Object DisplayName
Consiglio

Con l’aggiunta della pipeline more si può anche strut­tu­ra­re di­ver­sa­men­te la lunga lista dei servizi, di modo che si possa sfogliare pagina per pagina.

Ri­so­lu­zio­ne dei problemi: ricerca di errori di sistema nel registro eventi

I registri eventi (in inglese event logs) for­ni­sco­no agli am­mi­ni­stra­to­ri di sistema in­for­ma­zio­ni sui messaggi di errore nelle ap­pli­ca­zio­ni, nel sistema operativo o nelle funzioni di sicurezza di un di­spo­si­ti­vo. Con il comando Get-EventLog potete vi­sua­liz­za­re e gestire questi registri. Ad esempio, se si desidera vi­sua­liz­za­re i messaggi di errore nel Vi­sua­liz­za­to­re eventi di sistema, digitate quanto segue:

Get-EventLog System | Where-Object {$_.entryType -Match "Error"}

Se Po­wer­Shell re­sti­tui­sce troppi risultati facendovi perdere la visione d'insieme, è possibile uti­liz­za­re il parametro -Newest 100 per limitare l'elenco alle 100 voci del registro di sistema più re­cen­te­men­te inserite, che vengono poi filtrate in base agli errori:

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

Per in­for­ma­zio­ni det­ta­glia­te 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

Ma­nu­ten­zio­ne remota: con­trol­la­re i servizi sui computer remoti

La Windows Ma­na­ge­ment In­stru­men­ta­tion (WMI) fornisce l'accesso a quasi tutte le im­po­sta­zio­ni e le funzioni dei computer Windows, di­ven­tan­do così lo strumento più im­por­tan­te per l'au­to­ma­zio­ne dei processi e la ma­nu­ten­zio­ne remota delle po­sta­zio­ni di lavoro digitali. È inoltre possibile uti­liz­za­re il cmdlet Get-WmiObject per i computer remoti, in modo da poter uti­liz­za­re anche Windows Po­wer­Shell come strumento di gestione del sistema. Per esempio, se avete bisogno di in­for­ma­zio­ni sulla classe Win32_BIOS su un computer in rete (rap­pre­sen­ta­ta dal parametro -no­me­com­pu­ter), il seguente comando vi aiuterà:

Get-WmiObject Win32_Bios -nomecomputer

In al­ter­na­ti­va 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 im­po­sta­zio­ni di sistema interne del computer esterno. L'esempio seguente illustra come re­cu­pe­ra­re i metodi del servizio Windows Update Client per scoprire quali cmdlets possono essere uti­liz­za­ti per avviarlo, ar­re­star­lo e riav­viar­lo:

Get-WmiObject -nomecomputer -Class Win32_Service -Filter "Name='wuauserv'"

Come si può vedere, Get-WmiObject –no­me­com­pu­ter mira prima di tutto al computer de­si­de­ra­to e poi seleziona la classe Win32_Service usando il parametro -Class. Il Windows Update Client con l'ab­bre­via­zio­ne wuauserv viene quindi filtrato dai servizi esistenti. Con il cmdlet Get-Member, già pre­sen­ta­to, e il parametro -Type Method si ottiene una pa­no­ra­mi­ca di tutti i metodi per wuauserv che con­sen­to­no di con­trol­la­re il client a distanza:

Get-WmiObject -nomecomputer -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method
Vai al menu prin­ci­pa­le