martedì 6 dicembre 2022

PowerShell: Convertire gli ID delle lingue in nomi estesi

Per visualizzare gli ID delle lingue installate nel sistema è possibile procedere tramite PowerShell con comandi del tipo 
 $os = Get-CIMInstance -ClassName Win32_OperatingSystem  
 $os.MUILanguages   
Tali comandi restituiscono l'elenco degli ID relativi ai pacchetti di lingue installate nel sistema operativo come mostrato in FIG 1.
ID Lingue installate
FIG 1 - ID Lingue installate

L'output del comando restituisce un dato di tipo stringa pertanto, per convertire gli ID nei nomi estesi di lingua e paese, basterà eseguire il cast in un oggetto CultureInfo. Ad esempio:
 $os = Get-CIMInstance -ClassName Win32_OperatingSystem  
 [CultureInfo[]]$os.MUILanguages  
In questo modo avremo in output maggiori informazioni tra cui anche il nome esteso della lingua e del paese.
Cast da stringa a CultureInfo
FIG 2 - Cast da stringa a CultureInfo







mercoledì 23 novembre 2022

Windows: Disattivare la protezione in tempo reale dell'Antivirus Microsoft Defender

In alcuni casi può essere utile disattivare, temporaneamente, la protezione in tempo reale dell'Antivirus Microsoft Defender, ad esempio quando un file viene riconosciuto come falso positivo ma di cui siamo certi della sua provenienza.
Nell'articolo PowerShell: Disattivare la protezione in tempo reale dell'Antivirus Microsoft Defender è stato mostrato come eseguire tale operazione tramite PowerShell. Per eseguire la stessa operazione tramite GUI i passaggi da seguire sono i seguenti:
  • Accedere alle Impostazioni di Windows (tramite la combinazione di tasti WIN + I);
  • Cliccare su Aggiornamento e Sicurezza;
    Impostazioni
    FIG 1 - Impostazioni


  • Selezionare la sezione Sicurezza di Windows quindi cliccare su Apri sicurezza di Windows;
    Sicurezza di Windows
    FIG 2 - Sicurezza di Windows

  • Cliccare su Protezione da Virus e minacce;
    Sicurezza in breve
    FIG 3 - Sicurezza in breve

  • Cliccare sul link Gestisci impostazioni;
    Protezione da virus e minacce, Gestisci impostazioni
    FIG 4 - Protezione da virus e minacce, Gestisci impostazioni

  • Disattivare l'opzione Protezione in tempo reale tramite l'apposito slider.

    Impostazioni di Protezione da virus e minacce
    FIG 5 - Impostazioni di Protezione da virus e minacce





giovedì 10 novembre 2022

Windows: Winget package manager

Winget è il package manager che Microsoft ha integrato nei suoi sistemi operativi (Windows 10 e Windows 11). La sua interfaccia a riga di comando, che può scoraggiare gli utenti meno esperti, consente di utilizzarlo per la creazione di script di installazione, per importare/esportare la lista dei software installati nel sistema e aggiornare tutti i programmi presenti con un solo comando.
Winget utilizza un’architettura flessibile che offre il supporto anche a sorgenti multiple in maniera analoga a quanto accade nei package manager in ambiente Linux. I repository possono essere integrati in un unico archivio locale e ciò rappresenta una funzionalità molto utile in ambito enterprise per garantire il controllo sulla distribuzione e aggiornamento dei software.
Per visualizzare un elenco dei comandi e opzioni disponibili del package manager, basta eseguire, da una finestra PowerShell, il comando
Winget
Winget
FIG 1 - Winget
Per visualizzare la versione di winget installata
Winget -v
Versione di Winget
FIG 2 - Versione di Winget
Per ricercare un applicazione nel repository il comando sarà simile a
winget search <appname>
ad esempio per ricercare le applicazioni acrobat il comando sarà
Winget search acrobat
quando si usa il comando per la prima volta bisogna accettare le condizioni dei contratti (FIG 3) per poter procedere.
Termini di utilizzo msstore
FIG 3 - Termini di utilizzo msstore
Il motore di ricerca integrato in Winget analizza tutti i metadati di ciascun elemento (non solo il nome dell'app ma anche l'ID ed altre informazioni aggiuntive). Se da un lato questo garantisce di visualizzare un'elenco il più esaustivo possibile dall'altro potrebbe mettere in difficoltà l'utente meno esperto che non sa quale software scegliere tra quelli proposti. Ad esempio possono essere proposti più versioni del software oppure possono esserci software presenti sia all'interno del repository principale di Winget che nel Microsoft Store
Ricerca applicazioni nei repository
FIG 4 - Ricerca applicazioni nei repository

Per limitare la ricerca ad un solo repository si può utilizzare l'opzione -s e specificando il repository desiderato (winget o msstore)
winget search acrobat -s winget
Winget, limitare la ricerca ad un solo repository
FIG 5 - Winget, limitare la ricerca ad un solo repository

Per ottenere maggiori informazioni su il pacchetto si può utilizzare il comando show seguito dal nome del pacchetto o il suo ID (generalmente si utilizza quest'ultimo in quanto consente di specificare con precisione il pacchetto di proprio interesse)
winget show  Adobe.Acrobat.Reader.64-bit
Winget, visualizzare maggiori informazioni su un pacchetto
FIG 6 - Winget, visualizzare maggiori informazioni su un pacchetto
Per l'installazione del software si utilizza il comando install ad es.
winget install --id Adobe.Acrobat.Reader.64-bit
winget install 7zip -s winget
Winget install
FIG 7 - Winget install
Winget scarica e installa per default la versione più recente del software indicato. L'elenco delle versioni disponibili può essere visualizzato aggiungendo il parametro --versions alla fine del comando
winget show 7zip -s winget --versions
Winget, visualizzare le versioni disponibili di un software
FIG 8 - Winget, visualizzare le versioni disponibili di un software
Il parametro -v utilizzato insieme al comando install, consente di specificare la versione del software da installare.
winget install 7zip -s winget -v 21.06
Il comando install supporta l'argomento -i (oppure -interactive)che richiama la modalità di installazione interattiva e l'argomento -h (oppure -silent) che procede con l'installazione senza visualizzare alcuna interfaccia all'utente
Tramite l'argomento --location è possibile indicare il percorso in cui installare il software tuttavia tale funzione dipende dalle opzioni offerte da ogni specifico installer (winget install <app> --location C:\CartellaPersonale).

Con il comando
Winget list
verrà restituito l’elenco completo dei programmi installati in formato testuale. Nell'elenco sono inclusi anche i software che non sono presenti nei repository di Winget e, nel caso in cui il package manager rilevi la presenza di pacchetti più aggiornati rispetto a quelli installati in locale, segnala le nuove versioni in una colonna separata all'interno dell'elenco.
Winget, elenco programmi installati
FIG 9 - Winget, elenco programmi installati
L'elenco dei soli pacchetti aggiornabili può essere ottenuto con il comando
Winget upgrade
Winget upgrade
FIG 10 - Winget upgrade
L'opzione --all, utilizzata con il comando upgrade, consente di aggiornare in un unica operazione tutti i software installati (ad eccezione dei software che non sono presenti nei repository di Winget)
Winget upgrade --all

La procedura di disinstallazione è altrettando semplice e viene utilizzato il comando uninstall. Con il seguente comando
winget uninstall 7zip 
si avvia la procedura di disinstallazione del software specificato.
L'argomento -v consente di specificare la versione del software da disinstallare (utile nel caso in cui siano installate più versioni di uno stesso software)
Come per l'installazione, anche in questo caso è supportato l'argomento -i che richiama la disinstallazione interattiva e l'argomento -h che, invece, avvia la disinstallazione in modalità silente.


Winget può essere difficile da approcciare ma esistono diversi strumenti che vengono in aiuto dell'utente:
  • Archivio dei pacchetti online 
    L'archivio dei pacchetti online è accessibile all’indirizzo https://winget.run. Il sito consente di effettuare ricerche nell’archivio dei software e ottenere righe di comando di installazione da copiare e incollare nel terminale.
    winget.run
    FIG 11 - winget.run

  • Interfaccia grafica WingetUI 
    Si tratta di un vero e proprio front-end nativo di Winget disponibile su Github all’indirizzo https://github.com/martinet101/WingetUI. L'interfaccia è molto intuitiva e divisa in sezioni: Discover Software elenca i pacchetti disponibili, che possono essere filtrati tramite la casella di ricerca in alto a sinistra. Software updates mostra i pacchetti aggiornabili, mentre Installed application propone una lista che comprende tutti i software installati nel sistema.
    WingetUI
    FIG 12 - WingetUI

Configurazione Winget

La configurazione predefinita del Windows Package Manager Winget può essere modificata agendo sul file settings.json (il file si trova in %LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\).
Per visualizzare e modificare il file JSON basta lanciare il comando
Winget settings
Se sul pc non è presente alcun software per la gestione dei file con estensione JSON, è possibile utilizzare un qualunque editor di testo (come ad esempio Blocco Note).
Per un elenco aggiornato delle impostazioni si può consultare la pagina https://aka.ms/winget-settings.

Source

All'interno del blocco Source è possibile specificare, attraverso autoUpdateIntervalInMinutes, ogni quanto tempo controllare gli aggiornamenti di una sorgente. Ad autoUpdateIntervalInMinutes, va assegnato un numero intero positivo che rappresenta l'intervallo di aggiornamento in minuti (di default 5). Assegnando zero il controllo degli aggiornamenti di una sorgente viene disabilitato. 
   "source": {  
     "autoUpdateIntervalInMinutes": 3  
   },  
La sorgente può essere aggiornata manualmente con il comando
winget source update

Visual

Le impostazioni del blocco Visual riguardano la modalità di visualizzazione degli elementi di Winget.
   "visual": {  
     "progressBar": "accent"  
   },  
Tramite progressBar è possibile specificare il colore della barra di avanzamento visualizzata da Winget. I valori accettati sono:
  • accent (default)
  • retro
  • rainbow

InstallBehavior

La sezione installBehavior è forse quella più interessante in quanto permette la modifica del comportamento predefinito dell'installazione e dell'aggiornamento dei pacchetti.

- disableInstallNotes
Con disableInstallNotes è possibile abilitare/disabilitare la visualizzazione delle note di installazione dopo un'installazione riuscita. L'impostazione predefinita è false.
   "installBehavior": {  
     "disableInstallNotes": true  
   },  

- defaultInstallRoot
Con defaultInstallRoot è possibile specificare il percorso di installazione di pacchetto (se il pacchetto ne richiede uno durante l'installazione). Può essere sovrascritto dal parametro --location. Questa impostazione viene utilizzata solo quando il manifest di un pacchetto include InstallLocationRequired e il percorso effettivo si ottiene aggiungendo l'ID del pacchetto alla radice.
   "installBehavior": {  
     "defaultInstallRoot": "C:\installRoot"  
   },       

- portablePackageUserRoot
L'impostazione portablePackageUserRoot influisce sulla directory principale predefinita in cui vengono installati i pacchetti in ambito Utente. Questa impostazione si applica solo ai pacchetti di tipo portable installer. L'impostazione predefinita è %LOCALAPPDATA%/Microsoft/WinGet/Packages/. Il valore del path va specificato come percorso assoluto.
   "installBehavior": {  
     "portablePackageUserRoot": "C:/Users/FooBar/Packages"  
   },  

- Preferences e Requirements
Alcune impostazioni sono duplicate per Preferences e Requirements. Tramite Preferences viene influenzato l'ordinamento delle varie opzioni disponibili quando si sceglie quella su cui agire. Ad esempio, l'ambito predefinito per l'installazione dei pacchetti è quello dell'utente corrente, ma se non si tratta di un'opzione disponibile, verrà scelto un installatore a livello di macchina. I Requirements filtrano le opzioni. Si tratta di requisiti quindi se non rispettati l'installazione non verrà portata a termine. Nell'esempio precedente, un Requirements relativo all'ambito dell'utente non avrebbe prodotto alcun installatore applicabile ma un errore.

Scope permette di specificare se il pacchetto deve essere installato per l'utente corrente o per l'intera macchina. Il parametro corrispondente è --scope e utilizza gli stessi valori (user o machine).
   "installBehavior": {  
     "preferences": {  
       "scope": "user"  
     }  
   },  
Con Locale è possibile specificare le impostazioni locali da usare. Il parametro corrispondente è --locale e utilizza il tag di lingua bcp47
   "installBehavior": {  
     "preferences": {  
       "locale": [ "en-US", "fr-FR" ]  
     }  
   },  
Architectures seleziona l'architettura da installare. ll parametro corrispondente è --architecture. Da notare che è possibile selezionare solo le architetture compatibili con il sistema in uso.
   "installBehavior": {  
     "preferences": {  
       "architectures": ["x64", "arm64"]  
     }  
   },  

UninstallBehavior

Le impostazioni di uninstallBehavior influenzano il comportamento predefinito della disinstallazione (se applicabile) dei pacchetti.

- PurgePortablePackage 
PurgePortablePackage influenza il comportamento predefinito per la disinstallazione di un pacchetto portable. Se impostato su true, la disinstallazione rimuoverà tutti i file e le directory rilevanti per il pacchetto. Questa impostazione si applica solo ai pacchetti con il tipo di installatore portable. Se il valore non è impostato o non è valido, l'impostazione predefinita è false.
   "uninstallBehavior": {  
     "purgePortablePackage": true  
   },  

Telemetry

Le impostazioni di telemetria controllano se Winget scrive eventi ETW che possono essere inviati a Microsoft su un'installazione predefinita di Windows.
   "telemetry": {  
     "disable": true  
   },  
Se impostata su true, l'impostazione telemetry.disable impedisce la scrittura di qualsiasi evento da parte del programma.

Logging

Le impostazioni di log controllano il livello di dettaglio dei file di log. Il parametro --verbose-logs annulla questa impostazione e crea sempre un log verboso. Il valore predefinito è info se il valore non è impostato o non è valido.
   "logging": {  
     "level": ["verbose", "info", "warning", "error", "critical"]  
   },  

Network

Le impostazioni network influenzano il modo in cui Winget utilizza la rete per recuperare pacchetti e metadati.
L'impostazione downloader controlla il codice utilizzato  durante il download dei pacchetti. I valori accettati sono:
  • default, che può essere una qualsiasi delle opzioni in base alla nostra determinazione;
  • wininet usa le API WinINet;
  • do usa il servizio Delivery Optimization.
L'impostazione doProgressTimeoutInSeconds aggiorna il numero di secondi da attendere in assenza di avanzamento prima del fallback. Il numero predefinito di secondi è 60, il minimo è 1 e il massimo è 600.
   "network": {  
     "downloader": "do",  
     "doProgressTimeoutInSeconds": 60  
   }  

Interactivity

Le impostazioni Interactivity controllano se Winget può mostrare messaggi interattivi durante l'esecuzione. Si noti che questo si riferisce solo ai prompt mostrati da Winget stesso e non a quelli mostrati dai programmi di installazione dei pacchetti.
  "interactivity": {  
     "disable": true  
   },  
Se impostata a true, l'impostazione interactivity.disable impedisce la visualizzazione di qualsiasi richiesta interattiva.

ExperimentalFeatures

Le impostazioni di experimentalFeatures riguardano la configurazione di queste funzioni "sperimentali". In questo nodo è possibile abilitare singole funzioni. L'esempio seguente mostra un esempio di funzionalità sperimentali.
   "experimentalFeatures": {  
     "experimentalCmd": true,  
     "experimentalArg": false  
   },  
- zipInstall
Questa funzione consente a Windows Package Manager di installare da un file zip. È possibile attivare la funzione come mostrato di seguito.
   "experimentalFeatures": {  
     "zipInstall": true  
   },  
- directMSI
Questa funzione consente al gestore di pacchetti di Windows di installare direttamente i pacchetti MSI con le API MSI anziché tramite msiexec. Si noti che quando si utilizza l'installazione silenziosa questa funzione è già attiva. È possibile attivare la funzione come mostrato di seguito.   
   "experimentalFeatures": {  
     "directMSI": true  
   },  
- openLogsArgument
Questa funzione consente a Windows Package Manager di aprire la cartella dei log predefinita dopo l'esecuzione, passando l'argomento --open-logs con qualsiasi comando. È possibile attivare la funzione come mostrato di seguito.
   "experimentalFeatures": {  
     "openLogsArgument": true  
   },  

- dependencies
La funzione sperimentale Dependencies mostra, per ora,  solo le informazioni sulle dipendenze dei pacchetti. È possibile attivare la funzione come mostrato di seguito.
  "experimentalFeatures": {  
     "dependencies": true  
   },  
     




martedì 25 ottobre 2022

PowerShell: Esportare l'elenco dei software installati

Per esportare l'elenco dei software installati in un file csv è possibile utilizzare il seguente script PowerShell
 $paths = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'  
 Get-ItemProperty $paths | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate, UninstallString | Sort-Object DisplayName | Export-Csv C:\temp\ElencoSoftware.csv  

Ovviamente al posto di C:\temp\ElencoSoftware.csv va specificato il percorso e il nome del file csv in cui si intende esportare l'elenco.
L'elenco mostra il Display Name del software, l'autore, la versione, la data di installazione e l'eventuale stringa da utilizzare per la disinstallazione.

Elenco Software installati
FIG 1 - Elenco Software installati



lunedì 24 ottobre 2022

Windows: Modificare la porta di Desktop Remoto

Connessione Desktop remoto è un componente presente in tutte le installazioni di Windows.
Connessione Desktop Remoto
FIG 1 - Connessione Desktop Remoto

Il servizio utilizza la porta 3389 ma in alcuni contesti potremmo avere la necessità di modificarla; ad esempio se in azienda, per questioni di sicurezza, l'accesso alla porta 3389 è inibito oppure se la porta è utilizzata da un altro servizio. Per modificare la porta utilizzata dal servizio RDP bisogna aprire l'editor del registro di sistema:
  • Avviare l'Editor del registro di sistema (WIN+R e digitare regedit seguito da invio); 
  • Posizionarsi sulla seguente chiave di registro
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp
    RDP-Tcp, PortNumber
    FIG 2 - RDP-Tcp, PortNumber

  • Individuare il valore PorNumber e aprire la finestra di modifica eseguendo un doppio click sul valore. Per semplificare la modifica della porta, selezionare l'opzione Decimale quindi, nella casella Dati valore, digitare il numero della porta desiderato (assicurandosi di utilizzare una porta libera).
    PortNumber
    FIG 3 - PortNumber

  • Dopo aver confermato la modifica, riavviare il sistema.

Per collegarsi al computer utilizzando la nuova configurazione basta aggiungere il numero della porta alla fine dell'indirizzo IP. Ad esempio 192.168.1.10:6262





domenica 23 ottobre 2022

PowerShell: Gestione credenziali di Windows (Windows Credential Manager)

Per accedere alle credenziali (password salvate) memorizzate dal gestore delle credenziali di Windows (Windows Credential Manager) utilizzando PowerShell, è necessario scaricare e installare il modulo "CredentialManager" tramite il comando:
 Install-Module -Name CredentialManager -Scope CurrentUser
PowerShell, Installazione modulo CredentialManager
FIG 1 - PowerShell, Installazione modulo CredentialManager


Per memorizzare le credenziali all'interno del gestore credenziali di Windows si utilizza il cmdlet New-StoredCredential
 New-StoredCredential -Target MieCredenziali -Credentials (Get-Credential) -Type Generic -Persist LocalMachine
PowerShell, Memorizza credenziali in Windows Credential Manager
FIG 2 - PowerShell, Memorizza credenziali in Windows Credential Manager


Per recuperare le credenziali salvate si utilizza il cmdlet Get-StoredCredential:
 $cred = Get-StoredCredential -Target MieCredenziali  
 # Per visualizzare le credenziali (utenza e password)  
 Write-Host -ForegroundColor green "Utente: " $cred.UserName  
 Write-Host -ForegroundColor green "Password: " $cred.GetNetworkCredential().Password  
PowerShell, Recuper credenziali da Windows Credential Manager
FIG 3 - PowerShell, Recuper credenziali da Windows Credential Manager


Windows Credential Manager memorizza in modo sicuro le credenziali per l'utente locale. Solo l'utente che ha originariamente salvato la credenziali può recuperarle.





sabato 22 ottobre 2022

Windows: Modificare\eliminare la cronologia della finestra di dialogo Esegui

La finestra di dialogo Esegui, raggiungibile tramite la combinazione di tasti WIN+R, memorizza i comandi che vengono eseguiti. Per eliminare uno o più comandi memorizzati bisogna agire tramite il registro di sistema:
  • Avviare l'Editor del registro di sistema (WIN+R e digitare regedit seguito da invio); 
  • Posizionarsi sulla seguente chiave di registro
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
  • Sul lato sinistro della finestra vengono riportati i comandi memorizzati contrassegnati da una lettera. Prendere nota della lettera che corrisponde all'elemento che si desidera eliminare dall'elenco, quindi selezionare ed eliminare l'elemento premendo il tasto Canc sulla tastiera oppure cliccare sull'elemento con il tasto destro del mouse e selezionare Elimina.
    Cronologia Esegui
    FIG 1 - Cronologia Esegui

  • Una finestra di dialogo chiederà di confermare l'eliminazione dell'elemento. Cliccare su Si.
    Conferma eliminazione valori
    FIG 2 - Conferma eliminazione valori

  • Una volta eliminati tutti gli elementi desiderati, eseguire un doppio click del mouse sul valore MRUList.
  • Nella casella Dati valore eliminare le lettere annotate precedentemente e corrispondenti agli elementi eliminati, quindi cliccare su OK per confermare la modifica
    MRUList
    FIG 3 - MRUList