Mi è capitato più volte di dover convertire dei piccoli file di comando, come .bat o .cmd, in file eseguibili, perché avevo la necessità di eseguire dei comandi, all'avvio del sistema operativo, in modo del tutto invisibile all'utilizzatore del computer, oggi proveremo a convertire degli script VBS o i PS1 di PowerShell in eseguibili.
Store Cli è un nuovo sistema, disponibile nelle ultime versioni PowerShell e di Windows 11, per ricercare e installare le app dello Store Microsoft dalla linea di comando, al momento Store Cli è in versione Preview, senza una pagina di riferimento o documentazione ufficiale disponibile. Come funzionamento, almeno per la parte dell'installazione delle app, lo possiamo paragonare a Winget, ma Store Cli ha in più una parte di ricerca e filtro delle app che Winget non ha.
Quando mi trovo a dover analizzare un file di testo, un txt o un log, molto lungo che contiene centinaia, se non migliaia, di righe, spesso e volentieri mi perdo qualche pezzo importante e così non capisco perché è fallita l'installazione di un programma o perché si è generato un errore nel sistema. Inoltre aprire con Notepad dei file di testo di dimensioni molto grandi può essere lento e pesante (ci sarebbe Notepad++ ma in ufficio non è sempre permesso installare e usare programmi di terze parti così mi devo arrangiare con Notepad).
Per sapere la versione di un programma eseguibile basterebbe cliccare con il tasto destro del mouse sopra il file .exe e dalle sue Proprietà leggerla nei Dettagli. Oppure potremmo trovarla nelle informazioni del programma, all'interno delle sue schermate, o delle impostazioni, anche nella lista dei programmi installati avremmo questo dato.
Durante l'esecuzione di determinati script di PowerShell diventa importante sapere cosa fanno i vari comandi e analizzare la presenza di errori. A volte capita che l'esecuzione locale di uno script vada bene, invece quando lo si esegue in remoto qualcosa vada storto, anche nel caso di operazioni pianificate, e bisogna capire dove il processo si blocca. Start-Transcript e Stop-Transcript sono due cmdlet che permettono di avviare, e poi fermare, la creazione un file di report che contiene tutti i comandi eseguiti dallo script e gli eventuali errori.
Start-Transcript
Stop-Transcript
Il visualizzatore eventi di Windows contiene tutto quello succede, ed è successo, nel nostro computer. Installazione di programmi e aggiornamenti di Windows, arresti improvvisi del computer, errori dei programmi o del sistema operativo, tutto questo, e molto altro, viene registrato nel visualizzatore eventi. E se volessimo che l'esecuzione dei nostri script PowerShell lasci una traccia nel visualizzatore eventi? Nessun problema, basta aggiungere qualche riga di codice allo script.
Al lavoro, chi gestisce l'antivirus e la sicurezza aziendale, ci chiede di eseguire un controllo supplementare quando rilevano qualcosa di strano e sospetto nei computer in uso agli utenti. I tool che ci chiedono di utilizzare sono Microsoft Safety Scanner e Kaspersky Virus Removal Tool, così mi sono messo a cercare un metodo per poterli avviare da remoto, in modo invisibile all'utilizzatore del computer, tramite PowerShell e NinjaOne.
WinGet è uno strumento dalla riga di comando che permette di installare, aggiornare, rimuovere applicazioni sui sistemi Windows. Pensate a quando dovete preparare un computer, o una serie di computer, su cui dovete installare gli stessi programmi più volte, bisogna aprire il browser, cercare e scaricarli, avviarli e cliccare un numero imprecisato di Avanti o Next, con Winget potete creare uno script che automatizzi il tutto e riduca il vostro intervento all'aggiunta di qualche riga allo script e poco altro.
Nell'epoca degli agenti AI che sanno interagire con i browser (Proxy di Convergence, LINK, Operator di OpenAI, etc.) e dei browser con agenti AI integrati (Comet, Opera Neon, Genspark, DIA, etc.), nonostante non siano ancora perfezionati né privi di rischi, può sembrare a prima vista anacronistico usare un programma di automazione che crei dei bot "stupidi".
Se vogliamo estrarre una lista di tutte le periferiche configurate nel sistema operativo possiamo utilizzare il cmdlet Get-PnpDevice di PowerShell, dato che le informazioni possono essere molte, e non tutte interessarci, vediamo ora come fare una serie di filtri per avere dei risultati più ridotti.
Get-PnpDevice
Un server NTP (Network Time Protocol) permette di mantenere sincronizzato l'orario del computer locale, che nel tempo potrebbe cambiare, con quello di questo server di riferimento che abbiamo scelto. A livello aziendale potrebbe essere presente un server di riferimento interno alla rete, in modo che tutti i computer aziendali abbiamo lo stesso orario.
Quando durante l'esecuzione di uno script PowerShell è necessario comunicare qualcosa all'utente del computer, o interagire con lui tramite un menu di scelte, è possibile usare il cmdlet Write-Host e personalizzare i colori dell'output in modo da evidenziare meglio i vari messaggi. Ci sono due opzioni da poter aggiungere a Write-Host, -ForegroundColor è il colore del testo del messaggio, -BackgroundColor è il colore di sfondo a questo testo.
Una "mancanza" di Powershell 7, non avendo una sua console, è la possibilità di modificare un file di testo, come uno script, dall'interno di PowerShell stesso. Ora si può fare con Microsoft Edit un editor dall'aspetto decisamente antico.
Continuando nello studio di PowerShell, mi sono imbattuto nel modulo PowerTree che permette di visualizzare l'elenco di file e cartelle in modo molto particolare e personalizzabile. Per installare il modulo, dalla PowerShell Gallery, si deve utilizzare questo comando Install-Module PowerTree e rispondere Y quando richiesto.
Il sistema operativo Microsoft, in determinate circostanze, come gli aggiornamenti di Windows, o su richiesta durante l'installazione di alcuni programmi, crea un punto di ripristino della configurazione che permette di tornare indietro, alla configurazione precedente, e superare eventuali problemi che si sono creati dopo l'operazione che avevamo eseguito. Esiste una sua interfaccia da cui gestire, creare o disattivare i punti di ripristino, ma in questo articolo vedremo come farlo con PowerShell e Vssadmin.
Al lavoro, presso una sede del cliente, lo stesso computer viene utilizzato da decine di persone, capita così molto spesso che i dischi fissi di questi computer siano completamente pieni e non ci sia neanche lo spazio per caricarci neanche un file di testo di pochi Kb. Questo accade perché Windows, durante il suo normale funzionamento scrive dei file temporanei, dei file di log, lascia dei resti di installazione dei programmi e tanto altro nella cartella Temp, e non solo, all'interno del proprio account di Windows. Se moltiplicate lo spazio inutilmente occupato per un numero indefinito di account si capisce perché, a un certo punto, il disco fisso si riempia completamente.
Sono da tempo alla ricerca di un metodo per la rimozione automatica di tutti i vecchi profili account, non in uso, dal disco fisso in modo da recuperare spazio, perché ogni profilo ha un suo peso, come vedremo dopo, e in certi computer aziendali, dove vi accedono decine di utenti, il disco fisso si riempie molto in fretta. In rete si trovano molti script che promettono la rimozione di questi vecchi profili utente, quando li ho provati sul campo mi hanno dato più problemi che benefici, oltre ad aver fatto qualche danno togliendo file e account che non dovevano essere toccati.
Al lavoro una serie di computer con Windows 10 avevano assegnato delle lettere di unità anche a quelle partizioni di sistema che solitamente ne sono prive. La cosa, oltre a creare confusione all'utente che poteva cercare di salvare dei dati in dischi che non erano adatti allo scopo, generava una lunga serie di avvisi di errore, per dischi fissi troppo pieni, nel portale di noi tecnici dove gestiamo i computer remoti. Così ho cercato i comandi giusti per rimuovere con PowerShell le lettere unità di troppo.
Quando il sistema operativo vede la presenza di troppi dispositivi dello stesso tipo, per esempio schede audio, cuffie e microfoni, può, in determinate occasioni o programmi, gestirli male e causarne un malfunzionamento, in genere mi capita con l'audio delle barre telefoniche o i programmi di chat aziendali. Si rende così necessario disattivare la periferica che crea il problema.
All'apertura di PowerShell 7 se compare un messaggio che segnala la presenza di una nuova versione di PowerShell è possibile eseguire l'aggiornamento, o eventualmente l'installazione se si usa ancora PowerShell 5, direttamente da PowerShell stesso.
Quando ci ritroviamo a dover scambiare dei file molto grossi con altre persone, il problema è sempre quello di come ridurne le dimensioni per trovare un qualche servizio, via mail o siti di condivisione dati, che accetti i nostri file e ne permetta l'invio. I file possono essere compressi e divisi, splittati, in varie parti di dimensioni ridotte più adatte al "trasporto", tramite un qualsiasi programma per la compressione dati ma se vogliamo questa operazione di suddivisione dei file la possiamo fare anche con PowerShell grazie al modulo FileSplitter.
Dopo che il cmdlet Send-MailMessage è diventato obsoleto, perché non garantiva più una comunicazione sicura con i server di posta, stavo cercando un modo, semplice, per inviare una email utilizzando PowerShell, finalmente ho trovato PoshMailKit di poshcodebear disponibile su GitHub. Nel titolo dell'articolo ho scritto "Gmail (e non solo)" perché lo script si dovrebbe (non posso garantirlo) poter adattare a qualsiasi server di posta SMTP di cui abbiate utenza, password e conosciate la porta utilizzata dal server SMTP. Con Libero e Gmail, quelli che avevo per provare, l'invio della posta ha funzionato.
Alcuni macchinari hanno un "bottone di sicurezza", da premere in caso di emergenza e anche "mister Burns" ne ha uno, quindi perché non dovrebbe avere qualcosa di simile anche il nostro sistema operativo? Ad esempio un "panic button", per automatizzare alcune operazioni difensive che possono essere utili se crediamo che improvvisamente un malware stia compromettendo il nostro computer.
In passato abbiamo visto come creare comandi personalizzati e come proteggere il terminale con una password, stavolta metteremo mano a PowerShell per integrare nel suo terminale Gemini, il chatbot di intelligenza artificiale di Google.
Al lavoro mi trovo a dover aggiungere un account locale amministratore in ogni computer, di una società che è stata acquisita, che ne risulta privo. Farlo manualmente diventa lungo e complesso, ripeterlo decine di volte diventa pesante, così ricorro a uno script PowerShell e al cmdlet New-LocalUser.