giovedì 31 luglio 2025

Windows : Risolvere l'Errore 0xc1900208 di Windows Update

Gli aggiornamenti di Windows sono cruciali per la sicurezza e la stabilità dei sistemi, ma possono spesso essere interrotti da errori inaspettati. Tra questi, l'errore 0xc1900208 è un problema ricorrente che ha afflitto gli utenti sia con gli aggiornamenti di Windows 10 che, più recentemente, con l'aggiornamento 24H2 di Windows 11. Questo errore, che si manifesta con l'impossibilità di procedere con l'installazione dell'aggiornamento, indica la presenza di software o driver incompatibili sul sistema.

Causa dell'Errore 0xc1900208

L'errore 0xc1900208 è una segnalazione diretta da parte di Windows Update che una o più componenti hardware o software installate sul sistema sono in conflitto con il processo di aggiornamento. Il sistema operativo esegue una scansione preliminare per verificare la compatibilità e, se rileva elementi "bloccanti" con una compatibilità "Hard" (ovvero, un blocco critico), interrompe l'aggiornamento per prevenire potenziali instabilità o malfunzionamenti.


Identificazione del Software o Driver Incompatibile

Il processo di risoluzione inizia con l'identificazione precisa del componente che sta causando il blocco. Fortunatamente, Windows Update fornisce un log dettagliato della scansione di compatibilità, eliminando la necessità di una ricerca manuale.

Accedere al File C:\$WINDOWS.~BT\Sources\Panther\ScanResult.xml.

Analizzare il contenuto del File XML ricercando le voci che indicano un blocco relativo a software o a driver:
- Software bloccante
Per verificare se l'errore è causato da un software non compatibile, ricercare le righe contenenti 
CompatibilityInfo BlockingType="Hard"
Il campo Title nella stessa riga indicherà il nome del programma responsabile del blocco. 
Ad esempio, in FIG 1, risulta che il software che sta impedendo l'aggiornamento è ExplorerPatcher.
Applicazione Bloccante
FIG 1 - Applicazione Bloccante


- Driver bloccante
Scorrere il file fino alla sezione Driver Packages quindi identificare i driver che presentano l'attributo 
BlockMigration="True"
In FIG2, i driver bloccanti sono oem113.inf e oem143.inf. 
Driver Bloccanti
FIG 2 - Driver Bloccanti

Gestione del Software Bloccante

Una volta identificato un programma bloccante, la soluzione più diretta è la sua disinstallazione o l'aggiornamento a una versione compatibile (se disponibile).

Gestione dei Driver Bloccanti

La gestione dei driver richiede maggiore cautela, poiché la rimozione di un driver errato può compromettere l'avvio del sistema

I file .inf (come oem113.inf) sono descrittori del driver. Per identificare il driver effettivo, seguire questi passaggi:
  • Aprire la cartella c:\windows\INF.
  • Cercare il file oemXXX.inf identificato nel ScanResult.xml.
  • Aprire il file .inf con un editor di testo (ad esempio, Blocco Note).
  • Cercare all'interno del file il nome del driver o dell'applicazione associata.

Una volta individuato il nome del driver è possibile tentare di aggiornarlo, disabilitarlo o rimuoverlo:
Aggiornamento: La prima e più sicura opzione è tentare di aggiornare il driver alla sua versione più recente. Questo può essere fatto tramite Windows Update, il sito web del produttore del dispositivo o l'utilizzo di strumenti di gestione dei driver. 

Disabilitazione (Temporanea): In alcuni casi, se l'aggiornamento non è possibile o se il driver non è critico per l'operatività di base, si potrebbe considerare di disabilitarlo temporaneamente tramite Gestione Dispositivi. Tuttavia, questa è una soluzione temporanea e non risolve la radice del problema di compatibilità.

Rimozione (con Cautela): La rimozione del driver è l'ultima risorsa e deve essere eseguita con estrema cautela. Prima di procedere, è imperativo creare un punto di ripristino del sistema o un backup completo. Se il driver è essenziale per un componente hardware, la sua rimozione potrebbe rendere il dispositivo inutilizzabile o impedire l'avvio del sistema. È consigliabile procedere con la rimozione solo se si è certi che il driver non sia critico o se si dispone di un driver sostitutivo pronto per l'installazione. La rimozione è possibile tramite Gestione Dispositivi o dal prompt dei comandi come amministratore eseguendo il comando
pnputil /delete-driver oemXXX.inf /uninstall /force


Tentativo di Aggiornamento di Windows

Dopo aver rimosso o aggiornato il software e/o i driver bloccanti, è possibile riprovare l'aggiornamento di Windows. In Windows 11 accedere alle Impostazioni (WIN+I), selezionare Windows Update quindi cliccare sul pulsante Riprova o Verifica disponibilità aggiornamenti.

Windows Update
FIG 3 - Windows Update





mercoledì 30 luglio 2025

Windows: Come eliminare il contenuto dei registri eventi di sistema

Esistono centinaia di file di registro eventi utilizzati in Windows da vari componenti del sistema operativo e da software di terze parti. Per impostazione predefinita, Windows memorizza i file di registro con estensione EVTX nella directory %SystemRoot%\System32\Winevt\Logs\.

È possibile cancellare i log dei registri eventi di sistema utilizzando il Visualizzatore Eventi (lo snap-in eventvwr.msc), il prompt dei comandi oppure utilizzando PowerShell. Quando si cancella il contenuto di un registro eventi, nel registro eventi Sistema viene generato un evento, con ID 104 o 1102, che indica la pulizia del log, chi l'ha eseguita e quando. È una traccia utile per l'audit.

Registro Eventi Sistema, ID evento 104, Log Clear
FIG 1 - Registro Eventi Sistema, ID evento 104, Log Clear

In questo articolo verranno mostrati in dettaglio i tre metodi più comuni per eliminare il contenuto dei registri eventi.

Metodo 1 - Visualizzatore Eventi (Event Viewer)

Per chi preferisce un approccio visivo (tramite GUI), la console Event Viewer (eventvwr.msc) è la soluzione più immediata: 
  1. Aprire la console di Visualizzatore eventi (premere la combinazione WIN+R e, nella finestra Esegui, digitare eventvwr.msc seguito Invio).
  2. Nel pannello di sinistra, navigare fino al registro eventi che si desidera ripulire (ad esempio, "Applicazione", "Sistema" o "Sicurezza").
  3. Cliccare con il tasto destro del mouse sul nome del registro eventi e selezionare "Cancella registro".

    Cancella registro
    FIG 2 - Cancella registro

  4. Verrà chiesto se si desidera salvare il contenuto del registro prima di cancellarlo. Questa è un'ottima pratica per la risoluzione dei problemi futuri o per la conformità.

    Richiesta conferma di cancellazione
    FIG 3 - Richiesta conferma di cancellazione

Questo metodo è perfetto per una pulizia rapida di un singolo log ma non è consigliato se si intende eseguire l'operazione su un numero elevato di log.


Metodo 2 - Prompt dei comandi

Per eliminare i log del registro eventi tramite il Prompt dei comandi si può utilizzare il tool wevtutil.exe.

Il primo passo consiste nell'individuare il nome del log che si intende eliminare. Per visualizzare l'elenco dei log disponibili avviare il Prompt dei comandi come amministratore e utilizzare il comando
WevtUtil enum-logs
oppure la versione breve
WevtUtil el
Elenco registri eventi
FIG 4 - Elenco registri eventi


Supponiamo di voler eliminare i log contenuti nel registro Applicazione. Il comando da utilizzare è 
WevtUtil cl Application

Per eseguire un backup prima di cancellare il contenuto del registro
WevtUtil cl Application /bu:Application_Bak.evtx
WevtUtil, Backup e cancellazione log del registro eventi Applicazione
FIG 5 - WevtUtil, Backup e cancellazione log del registro eventi Applicazione


Per pulire tutti i log presenti in tutti i registri eventi in un colpo solo, è possibile utilizzare il comando
for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"

Nel caso in cui volessimo utilizzare il comando all'interno di un file BAT la sintassi è leggermente diversa e il comando diventa
for /F "tokens=*" %%1 in ('wevtutil.exe el') DO wevtutil.exe cl "%%1"


Metodo 3 - PowerShell

Avviare la console PowerShell come amministratore. Per visualizzare l'elenco dei registri eventi
Get-WinEvent -ListLog *

Per ciascun registro eventi vengono visualizzati ulteriori dettagli come la dimensione massima, il numero di eventi contenuto e la modalità di log.
Get-WinEvent, Visualizza elenco registri eventi
FIG 6 - Get-WinEvent, Visualizza elenco registri eventi


Per eliminare il contenuto di un registro eventi si utilizza il cmdlet Clear-EventLog. Ad esempio, per eliminare il contenuto del registro eventi Applicazione:
Clear-EventLog –LogName Application
Clear-EventLog, cancellazione log del registro eventi Applicazione
FIG 7 - Clear-EventLog, cancellazione log del registro eventi Applicazione


Per eliminare il contenuto di più registri eventi basta separarli con una virgola. Ad esempio per eliminare il contenuto del registro Sicurezza e Sistema:
Clear-EventLog –LogName Security,System

Per eliminare il contenuto di tutti i registri eventi:
Get-WinEvent -ListLog * -Force | % { Wevtutil.exe cl $_.Logname }
Oppure
wevtutil el | Foreach-Object {wevtutil cl "$_"}


A volte, è possibile imbattersi in un errore di "accesso negato" con alcuni log. Questo può accadere se il log è in uso o se mancano i permessi necessari. In questi casi, un tentativo manuale tramite Event Viewer potrebbe risolvere il problema.




martedì 29 luglio 2025

Windows: Spegnere lo Schermo tramite riga di comando

Spegnere il monitor quando non è in uso può essere utile per ridurre significativamente il consumo energetico, sia su laptop che su desktop, e si rivela particolarmente utile durante l'esecuzione di lunghe attività o script che non richiedono l'interazione visiva con lo schermo

Per visualizzare il timeout attuale dello schermo, è possibile utilizzare la GUI del Pannello di Controllo navigando nelle opzioni di risparmio energia (control.exe powercfg.cpl,,3) oppure, per un approccio più rapido e scriptabile, si può ricorrere al Prompt dei Comandi o PowerShell con il comando:
powercfg /q

Questo comando elenca dettagliatamente tutte le impostazioni del piano di alimentazione attivo. Per un'analisi più specifica del timeout del display, si possono cercare le seguenti informazioni all'interno dell'output:

Disattiva schermo dopo
FIG 1 - Disattiva schermo dopo


  GUID sottogruppo: 7516b95f-f776-4464-8c53-06167f40cc99  (Schermo)
    Alias GUID: SUB_VIDEO
    GUID impostazioni risparmio energia: 3c0bc021-c8a8-4e07-a973-6b14cbcb2b7e  (Disattiva schermo dopo)
      Alias GUID: VIDEOIDLE
      Minima impostazione possibile: 0x00000000
      Massima impostazione possibile: 0xffffffff
      Incremento impostazioni possibile: 0x00000001
      Unità impostazioni possibili: Secondi
    Indice impostazione alimentazione CA corrente: 0x00000384
    Indice impostazione alimentazione CC corrente: 0x000000b4


Nell'esempio sopra, il valore 0x00000384 (in esadecimale) corrisponde a 900 secondi, ovvero 15 minuti, per lo spegnimento automatico del display quando il dispositivo è collegato alla corrente alternata (CA). Analogamente, 0x00000b4 rappresenta 180 secondi o 3 minuti per la modalità a batteria (CC).
Opzioni risparmio energia
FIG 2 - Opzioni risparmio energia



Configurare il Timeout di spegnimento del Display tramite riga di comando

Per modificare il tempo dopo il quale il display si spegne automaticamente all'interno del piano di alimentazione corrente, è possibile utilizzare i seguenti comandi:
  • Per la corrente alternata (AC), impostando un timeout di 5 minuti:
    powercfg -change -monitor-timeout-ac 5
  • Per la corrente continua (DC), impostando un timeout di 5 minuti:
    powercfg -change -monitor-timeout-dc 5
Questi comandi consentono una gestione granulare e scriptabile delle impostazioni di risparmio energetico del monitor.


Spegnimento immediato del Display tramite PowerShell

Per situazioni in cui è necessario spegnere il display immediatamente, Windows offre una soluzione tramite PowerShell che sfrutta le API di sistema. Questo metodo è particolarmente utile per script automatizzati o per creare scorciatoie personalizzate.

Esegui il seguente comando in un prompt dei comandi o direttamente tramite la finestra Esegui (Win+R):
cmd.exe /c powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)


Questo comando richiama la funzione SendMessage dell'API user32.dll per inviare un messaggio di spegnimento al monitor.





lunedì 28 luglio 2025

Windows 11: Rimuovere Modifica con Foto, Modifica con Paint e Modifica nel Blocco note dal menu contestuale

In Windows 11 Microsoft ha modernizzato l'interfaccia utente, ma non senza conseguenze sul piano dell’usabilità quotidiana. Uno degli aspetti più controversi è il nuovo menu contestuale il quale si presenta più affollato rispetto alle versioni precedenti. Oltre alle voci essenziali, include numerose opzioni considerate superflue da molti utenti, come ad esempio "Modifica con Foto", "Modifica con Paint" e "Modifica nel Blocco note".
Windows 11, menu contestuale
FIG 1 - Windows 11, menu contestuale


Queste voci vengono aggiunte automaticamente da applicazioni di sistema e possono risultare ridondanti, specie se l’utente non fa uso abituale di tali strumenti. Fortunatamente, è possibile rimuoverle in modo selettivo intervenendo direttamente sul Registro di sistema.

Oltre a una questione estetica, un menu contestuale più snello migliora la produttività e può ridurre il tempo necessario per individuare le funzioni realmente utili. 


Per eliminare queste voci dal menu contestuale in modo sicuro e reversibile è possibile utilizzare uno dei seguenti metodi.

Metodo 1 - Tramite l'Editor del Registro di Sistema

  • Aprire l'Editor del Registro di Sistema cliccando su Start, quindi Esegui (o premere la combinazione di tasti WIN+R) e digitare regedit seguito da Invio.
  • Navigare fino a 
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Shell Extensions
  • Creare, se non presente, la chiave Blocked: Cliccare con il tasto destro del mouse su Shell Extensions, selezionare Nuovo quindi Chiave. Assegnare alla nuova chiave il nome Blocked
  • All'interno della chiave Blocked è possibile creare più valori stringa ognuno corrispondente a una specifica voce che si intendere rimuovere. I nomi da assegnare ai valori stringa sono:
    Modifica con Foto
      {BFE0E2A4-C70C-4AD7-AC3D-10D1ECEBB5B4}
    Modifica con Paint
      {2430F218-B743-4FD6-97BF-5C76541B4AE9}
    Modifica nel Blocco note
      {CA6CC9F1-867A-481E-951E-A28C5E4F01EA}
  • Chiudere  l'Editor del Registro di Sistema e riavviare il sistema o il processo di "Esplora risorse" (Explorer.exe).
Editor del Registro di sistema
FIG 2 - Editor del Registro di sistema


Per ripristinare le voci eliminate è sufficiente tornare nella chiave "Blocked" e cancellare i valori stringa corrispondenti. Al riavvio, le voci torneranno visibili nel menu contestuale.


Metodo 2 - Tramite Prompt dei comandi

Dal Prompt dei comandi eseguire il comando relativo alla voce che si intende rimuovere:
Modifica con Foto
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{BFE0E2A4-C70C-4AD7-AC3D-10D1ECEBB5B4}" /t REG_SZ /d "" /f
Modifica con Paint
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{2430F218-B743-4FD6-97BF-5C76541B4AE9}" /t REG_SZ /d "" /f
Modifica nel Blocco note
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{CA6CC9F1-867A-481E-951E-A28C5E4F01EA}" /t REG_SZ /d "" /f

Per ripristinare le voci del menu contestuale:
Modifica con Foto
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{BFE0E2A4-C70C-4AD7-AC3D-10D1ECEBB5B4}" /f
Modifica con Paint
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{2430F218-B743-4FD6-97BF-5C76541B4AE9}" /f
Modifica nel Blocco note
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v "{CA6CC9F1-867A-481E-951E-A28C5E4F01EA}" /f

Metodo 3 - Tramite file .reg

Dal seguente link è possibile scaricare i file .reg per rimuovere/ripristinare le 3 voci nel menu contestuale.


Conclusioni

Personalizzare il menu contestuale di Windows 11 non è solo un esercizio di estetica, ma una vera e propria ottimizzazione del flusso di lavoro. Attraverso semplici modifiche al Registro di sistema, è possibile creare un’interfaccia più pulita, rapida e funzionale. Tuttavia, è sempre consigliabile procedere con attenzione, fare un backup del Registro prima di ogni intervento e documentarsi accuratamente.




sabato 26 luglio 2025

Ransomware: Decryptor per Phobos e 8base ransomware

La Polizia Giapponese e il Laboratorio F6 hanno reso disponibili nuovi Decryptor gratuiti per i ransomware Phobos e 8base.

Il ransomware Phobos, individuato per la prima volta nell'ottobre 2017 e ampiamente diffuso dal 2019, è diventato uno dei programmi ransomware più noti e utilizzati degli ultimi anni. Phobos opera attraverso un modello di Ransomware-as-a-Service (RaaS), permettendo a chiunque di noleggiare strumenti di attacco in cambio di una percentuale del riscatto. Questo modello ha contribuito alla sua vasta diffusione, rendendolo responsabile di numerosi attacchi contro aziende in tutto il mondo. 
Tipicamente, gli attacchi Phobos avvengono tramite l'infiltrazione nelle reti attraverso servizi di accesso remoto vulnerabili (come RDP), la crittografia dei file utente e aziendali e la successiva richiesta di riscatto, spesso con messaggi personalizzati e minacce di perdita completa dei dati.

Nel 2023, un gruppo di affiliati ha lanciato l'operazione 8base, utilizzando un encryptor Phobos modificato. A differenza di altri affiliati, questo gruppo si è dedicato alla doppia estorsione, crittografando i file e rubando dati, minacciando di rilasciarli in caso di mancato pagamento del riscatto.

Nel 2024 un cittadino russo sospettato di essere l'amministratore dell'operazione Phobos è stato estradato dalla Corea del Sud agli Stati Uniti per affrontare le accuse

La lotta contro il ransomware Phobos ha visto importanti progressi quest'anno: l'operazione Phobos ha subito un'interruzione significativa grazie a un'operazione internazionale coordinata delle forze dell'ordine, che ha portato al sequestro di 27 server e all'arresto di quattro cittadini russi sospettati di guidare il gruppo ransomware 8base.

Grazie alle informazioni ottenute da queste operazioni, la polizia giapponese ha rilasciato un decryptor gratuito per le organizzazioni e gli individui i cui file sono stati crittografati dai ransomware Phobos e 8base. Il decryptor è disponibile per il download dal sito web della polizia giapponese (www.npa.go.jp/english/bureau/cyber/ransomdamagerecovery.html),  con istruzioni anche in inglese, ed è distribuito anche da Europol e FBI sulla piattaforma NoMoreRansom.

Alcuni browser web, inclusi Google Chrome e Mozilla Firefox, possono rilevare il tool come un malware ma si tratta di un falso positivo. Il tool non è dannoso e decifra con successo i file crittografati dalle versioni recenti degli encryptor. Il decryptor supporta attualmente le estensioni ".phobos", ".8base", ".elbie", ".faust" e ".LIZARD", ma la polizia giapponese suggerisce che potrebbe supportare anche altre estensioni.

Parallelamente, il laboratorio di analisi forense e malware digitale F6 ha introdotto un proprio strumento per decifrare i dati crittografati dal ransomware Phobos: PhobosDecryptor. Questa utility è progettata per le aziende, offrendo un metodo gratuito e sicuro per recuperare i file. Lo sviluppo di F6 è una risposta al decryptor alternativo rilasciato dalle forze dell'ordine giapponesi, ma si distingue per la sua ampia compatibilità, superando le limitazioni della versione giapponese che non supporta le versioni obsolete di Windows. Il team di F6 ha pubblicato non solo lo strumento, ma anche una documentazione dettagliata sulla gestione di diverse famiglie di ransomware, inclusi materiali sulla decrittazione, l'analisi del comportamento del malware e raccomandazioni per la protezione.

PhDec Decryptor

  • Eseguire il download di PhDec Decryptor da www.npa.go.jp/english/bureau/cyber/ransomdamagerecovery.html o da NoMoreRansom. Il tool viene distribuito all'interno di un file .zip, quindi una volta eseguito il download estrarre il contenuto del file.

    Download PhDec Decryptor
    FIG 1 - Download PhDec Decryptor

  • Per poter utilizzare il decryptor è necessario leggere i Termini di servizio e accettarli cliccando sul pulsante Agree.

    Termini di Servizio
    FIG 2 - Termini di Servizio

  • Se viene visualizzata la seguente finestra di dialogo relativa alla disabilitazione del limite dei 260 caratteri dei path, cliccare sul pulsante OK.

    Richiesta di conferma di disabilitazione del limite dei 260 caratteri per il filepath
    FIG 3 - Richiesta di conferma di disabilitazione del limite dei 260 caratteri per il filepath

  • Accettando la disabilitazione del limite dei 260 caratteri, potrebbe essere richiesto di confermare la modifica al registro di sistema. Cliccare su per proseguire.

    Consentire all'app di procedere con la modifica
    FIG 4 - Consentire all'app di procedere con la modifica

  • A questo punto viene visualizzata la finestra di dialogo che conferma la disabilitazione del limite e viene chiesto di riavviare il decryptor.

    Limite lunghezza filepath disabilitato
    FIG 5 - Limite lunghezza filepath disabilitato

  • Riavviando PhDec viene richiesto nuovamente di accettare i Termini di servizio, dopodiché verrà visualizzata la schermata principale del decryptor.  In questa schermata sarà possibile selezionare la cartella contenente i dati da decriptare (verranno decriptati anche i file presenti nelle sottocartelle) o specificare un singolo file. Oltra alla cartella/file da decryptare sarà necessario specificare anche una cartella di output in cui verranno salvati i file decriptati.

    PhDec Decryptor
    FIG 6 - PhDec Decryptor

  • A questo punto basterà cliccare sul pulsante Decrypt e attendere il termine dell'operazione. Verrà visualizzato un breve report contenente alcune informazioni: 
    Target file(s): Numero di file da analizzare.
    Successful file(s): numero di file decrittografati con successo.
    Failed file(s):  numero di file che non è stato possibile decrittografare.
    Untouched file(s):numero di file non elaborati. 
    Unsupported file(s): numero di file esclusi (file danneggiati, ecc.)


PhobosDecryptor

  • Eseguire il download di PhobosDecryptor da github.com/f6-dfir/Ransomware/tree/main/Phobos/PhobosDecryptor.
  • Scompattare il file .7z. Al suo interno sono presenti 2 file PhobosDecryptor.exe PhobosDecryptor64.exe a seconda della versione del Sistema Operativo (a 32 o 64 bit) su cui verranno eseguiti.
  • La sintassi è molto semplice 
    PhobosDecryptor [-all] [-r] [-d] [<PATH1>] [<PATH2>] ... [<PATHN>]

    -all - Scan all fixed disks.
    <PATH1>, <PATH2>, ... <PATHN> - paths to scan.

    -r - Replace existing files.
    -d - Delete encrypted files.


Conclusioni

Il rilascio di questi nuovi strumenti di decrittazione rappresenta un passo significativo nella lotta contro il ransomware Phobos, offrendo alle aziende colpite una possibilità concreta di recupero senza dover cedere ai ricatti dei cybercriminali. Strumenti come quello sviluppato da F6 si distinguono per la loro ampia compatibilità e per l'approccio responsabile che include documentazione dettagliata e risorse utili per la prevenzione futura.
Il caso Phobos sottolinea ancora una volta l'importanza non solo di reagire agli attacchi, ma anche di investire nella sicurezza preventiva: aggiornare costantemente le infrastrutture IT, ridurre la superficie di attacco ed educare gli utenti sui rischi legati all'uso di servizi di accesso remoto non protetti. In definitiva, questi strumenti non sono solo una risposta tecnica a un problema concreto, ma anche un segnale importante per rafforzare la resilienza collettiva contro le minacce ransomware in continua evoluzione. La sicurezza si conferma una responsabilità condivisa tra ricercatori, aziende e utenti finali.




venerdì 25 luglio 2025

Windows: Limite massimo di connessioni simultanee in Windows 10 e 11

Sia Windows 10 che Windows 11, indipendentemente dall'edizione specifica (Home, Pro, Enterprise), supportano un massimo di 20 sessioni in entrata simultanee. Questo significa che, se un computer con Windows 10/11 viene impiegato come server di file o di stampa "rudimentale", gli utenti esterni potrebbero riscontrare un errore nel tentativo di connessione una volta superato questo limite. Il messaggio d'errore tipico è eloquente: "Impossibile effettuare altre connessioni al computer remoto adesso perché è stato superato il numero massimo di connessioni che il computer può accettare."

Questa limitazione è esplicitamente indicata nel Contratto di Licenza per l'Utente Finale (EULA) di Windows. Il EULA specifica che un massimo di 20 dispositivi possono accedere da remoto al software installato sul dispositivo con licenza, esclusivamente per l'utilizzo di funzionalità specifiche quali servizi file, servizi di stampa, servizi di informazione Internet, condivisione della connessione Internet e servizi di telefonia. È interessante notare come il contratto permetta un numero illimitato di dispositivi per la sincronizzazione dei dati, evidenziando la chiara distinzione tra l'uso desktop e quello server.

La ragione di queste restrizioni è chiara: Microsoft mira a orientare gli utenti verso le edizioni server di Windows per scenari di utilizzo che richiedono capacità di rete superiori, incoraggiando l'acquisto di licenze Windows Server o, in alternativa, l'adozione di soluzioni open-source come Samba.


Verifica e gestione dei Limiti di Connessione

Per verificare il limite corrente delle sessioni in entrata su un sistema Windows 10/11, è possibile utilizzare il comando 
net config server
nel Prompt dei comandi. L'output mostrerà il parametro "N. massimo di utenti con accesso" (Maximum Logged On Users), che per le edizioni desktop sarà invariabilmente 20. In contrasto, le edizioni Windows Server offrono limiti significativamente più elevati, ad esempio 16.777.216 per le connessioni SMB.

Un altro parametro importante da considerare è il "Tempo di inattività sessione (min)" (Idle session time (min))
. Per impostazione predefinita, Windows disconnette una sessione inattiva dopo 15 minuti.
Ridurre questo valore, ad esempio a 5 minuti utilizzando il comando 
net config server /autodisconnect:5
può contribuire a liberare sessioni inattive più rapidamente, rendendo disponibili nuove connessioni.
Limite connessioni simultanee
FIG 1 - Limite connessioni simultanee



Intervento Manuale e Automazione per la Gestione delle Sessioni

Quando il numero massimo di connessioni viene raggiunto, è possibile intervenire manualmente per disconnettere alcune sessioni. 

Metodo 1 - Utilizzando Gestione computer
Avviare Gestione computer (compmgmt.msc). Navigare su Utilità di sistema->Cartelle condivise->Sessioni per visualizzare tutte le connessioni di rete attive al computer. 
Per eliminare una connessione basta cliccarci su con il tasto destro del mouse e selezionare Chiudi sessione.
Gestione computer, Sessioni attive
FIG 2 - Gestione computer, Sessioni attive



Metodo 2 - Utilizzando il Prompt dei comandi
Il comando 
net session
elenca tutte le connessioni di rete attive al computer. 
Per disconnettere una sessione specifica, si può utilizzare 
net session \\<indirizzo_IP_o_hostname> /d
Per reimpostare tutte le connessioni attive, il comando è 
net session /delete
Prompt dei comandi, Net Session
FIG 3 - Prompt dei comandi, Net Session



Metodo 3 - Utilizzando PowerShell
Per un approccio più proattivo e automatizzato, è possibile sfruttare PowerShell. Di seguito è riportato un esempio di script PowerShell che, al raggiungimento di 19 connessioni concorrenti (lasciando un piccolo buffer prima del limite massimo), identifica e disconnette le due sessioni più inattive. Questo script può essere adattato per implementare logiche di disconnessione più complesse basate su specifiche esigenze.

# Definizione del numero di sessioni più vecchie da terminare quando si raggiunge il limite.
$sessionsToKillCount = 2

# Definisce la soglia di connessioni a partire dalla quale lo script agirà.
$connectionThreshold = 19

# Recupera le sessioni di rete attive.
$netSessionOutput = net session 2>$null | Select-String -Pattern '\\'

# Calcola il numero attuale di connessioni analizzando le righe filtrate.
$currentConnections = ($netSessionOutput | Measure-Object -Line).Lines

# Controlla se il numero di connessioni attuali supera la soglia definita.
if ($currentConnections -ge $connectionThreshold) {
    Write-Host "Raggiunta la soglia di $connectionThreshold connessioni ($currentConnections attuali). Procedo alla disconnessione delle sessioni inattive." -ForegroundColor Yellow

    # Inizializza un array vuoto per contenere gli oggetti sessione parsati.
    $parsedSessions = @()

    # Itera su ogni riga di output di 'net session' per estrarre i dettagli della sessione.
    foreach ($line in $netSessionOutput) {
        # Suddivide la riga in parti utilizzando uno o più spazi come delimitatore,
        # limitando lo split a 4 parti per gestire correttamente i nomi utente/computer con spazi.
        $parts = $line -split '\s+', 4

        # Verifica che ci siano abbastanza parti per evitare errori se il formato della riga è inatteso.
        if ($parts.Count -ge 4) {
            # Crea un oggetto personalizzato (PSObject) per ogni sessione.
            $sessionObject = [PSCustomObject]@{
                Computer = $parts[0].Trim();       # Il nome del computer o IP remoto
                Username = $parts[1].Trim();       # Il nome utente della sessione
                Opens    = [int]$parts[2].Trim();  # Il numero di file/risorse aperte (convertito a int)
                IdleTime = $parts[3].Trim();       # Il tempo di inattività della sessione (stringa da parsare)
            }
            $parsedSessions += $sessionObject
        } else {
            Write-Warning "Skipping malformed line: '$line'"
        }
    }

    # Ordina le sessioni per tempo di inattività in ordine decrescente (le più inattive per prime).
    $oldestSessions = $parsedSessions | Sort-Object -Property IdleTime -Descending | Select-Object -First $sessionsToKillCount

    # Itera sulle sessioni più vecchie identificate e disconnettile.
    foreach ($sessionToDisconnect in $oldestSessions) {
        Write-Host "Disconnessione della sessione da $($sessionToDisconnect.Computer) (Utente: $($sessionToDisconnect.Username), Inattività: $($sessionToDisconnect.IdleTime))." -ForegroundColor Cyan
        # Disconnette la sessione
        net session "$($sessionToDisconnect.Computer)" /d /y
        # Aggiungiamo un piccolo ritardo per evitare di sovraccaricare il sistema o che i comandi si accavallino.
        Start-Sleep -Milliseconds 200
    }

    Write-Host "Disconnessione delle sessioni completata." -ForegroundColor Green
} else {
    Write-Host "Numero di connessioni attuali ($currentConnections) inferiore alla soglia di $connectionThreshold. Nessuna azione richiesta." -ForegroundColor Green
}


Questo script può essere schedulato tramite l'
Utilità di Pianificazione di Windows (Task Scheduler) per essere eseguito a intervalli regolari (ad esempio, ogni 5 o 10 minuti), garantendo che le sessioni inattive vengano rimosse automaticamente, liberando risorse preziose.


Considerazioni Legali e Tecniche

È importante sottolineare che, sebbene in passato siano esistite patch per il file 'tcpip.sys' che permettevano di aggirare il limite di sessioni nelle edizioni desktop di Windows (similmente alla libreria RDP Wrapper per Remote Desktop), tali soluzioni non sono state osservate per Windows 10 e 11. In ogni caso, l'utilizzo di tali modifiche costituisce una violazione diretta del Contratto di Licenza per l'Utente Finale di Microsoft, esponendo l'organizzazione a rischi legali e di sicurezza.
In conclusione, la gestione dei limiti di connessioni concorrenti in Windows 10 e 11 è una best practice essenziale per gli ambienti IT che utilizzano queste piattaforme in ruoli multi-utente. Comprendere le restrizioni, monitorare le sessioni e implementare soluzioni di automazione, come gli script PowerShell, permette di mitigare l'impatto di questi limiti, garantendo un'esperienza utente fluida e prevenendo interruzioni inaspettate. Per scenari che richiedono un'elevata capacità di connessione o funzionalità server complete, l'investimento in un sistema operativo server dedicato rimane la soluzione più robusta e conforme alle licenze.




giovedì 24 luglio 2025

MS Outlook: Eliminare le cartelle vuote tramite PowerShell

Le cartelle vuote in Outlook possono accumularsi nel tempo, rendendo più difficile la gestione della posta e occupando spazio inutilmente. Questo articolo illustra come utilizzare uno script PowerShell per identificare ed eliminare in modo efficiente le cartelle di posta vuote, inclusi i feed RSS, mantenendo al sicuro le cartelle predefinite di sistema.

Per scaricare lo script è possibile cliccare sul seguente link


Lo script PowerShell esegue:
  • Analisi Gerarchica
    Scansiona ricorsivamente l'intera struttura delle cartelle di una casella di posta o di un file di dati Outlook.
  • Identificazione delle Cartelle di Posta
    Si concentra solo sulle cartelle che contengono (o potrebbero contenere) messaggi di posta elettronica, ignorando elementi come calendari o contatti.
  • Rilevamento Cartelle Nascoste
    Identifica e ignora le cartelle di sistema nascoste, evitando operazioni indesiderate su componenti interni di Outlook.
  • Report Dettagliato
    Genera un file di testo con l'elenco completo delle cartelle visibili, mostrando il loro percorso completo e il numero di elementi contenuti.
  • Pulizia Intelligente
    Offre la funzionalità (opzionale e controllata) di eliminare automaticamente le cartelle che sono completamente vuote e non contengono sottocartelle.

Come Funziona lo Script

Lo script si basa sull'interazione con il modello a oggetti COM (Component Object Model) di Microsoft Outlook, una potente interfaccia che permette a script e applicazioni esterne di controllare Outlook.

1. Inizializzazione e Connessione a Outlook
try {
    $outlookApp = New-Object -ComObject Outlook.Application
}
catch {
    Write-Error "Errore durante l'avvio dell'applicazione Outlook. Assicurati che Outlook sia installato."
    exit 1 
}
$mapiNamespace = $outlookApp.GetNameSpace("MAPI")

Il primo passo è creare un'istanza dell'applicazione Outlook. Un blocco try-catch garantisce che lo script gestisca elegantemente l'assenza di Outlook o altri problemi di avvio. Successivamente, si ottiene il Namespace("MAPI"), che è la porta d'accesso a tutti gli archivi di dati di Outlook (caselle di posta, file PST/OST, archivi).


2. Selezione dell'Archivio Dati
try {
    Write-Host "Seleziona la cartella da cui desideri iniziare l'analisi (questa sarà la radice della scansione)..."
    $startFolder = $mapiNamespace.PickFolder() # Cattura l'oggetto Folder selezionato
    
    if ($startFolder -eq $null) {
        Write-Error "Nessuna cartella selezionata. Lo script verrà terminato."
                [System.Runtime.InteropServices.Marshal]::ReleaseComObject($mapiNamespace) | Out-Null
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($outlookApp) | Out-Null
        exit 1
    }
    Write-Host "La scansione inizierà dalla cartella: $($startFolder.FullFolderPath)"
}
catch {
    Write-Error "Errore durante la selezione della cartella. Lo script verrà terminato."
    # Rilascia l'oggetto Outlook prima di uscire per pulire le risorse.
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($mapiNamespace) | Out-Null
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($outlookApp) | Out-Null
    exit 1
}

Una caratteristica chiave è la flessibilità: lo script chiede all'utente di selezionare una cartella tramite l'interfaccia di Outlook ($mapiNamespace.PickFolder()). Questo permette di scegliere qualsiasi casella di posta configurata o file di dati (come un PST), rendendo lo script versatile per diversi scenari. Una volta selezionata la cartella questa viene impostata come punto di partenza per la scansione.
Selezione cartella
FIG 1 - Selezione cartella



3. Preparazione dell'Output
$timestamp = Get-Date -Format "yyyy-MM-dd.HH-mm-ss"
$outputDirectory = Join-Path -Path $env:USERPROFILE -ChildPath "Documents"
$outputFileName = "OutlookFolderNames_$timestamp.txt"
$outputPath = Join-Path -Path $outputDirectory -ChildPath $outputFileName

if (-not (Test-Path -Path $outputDirectory -PathType Container)) {
    New-Item -Path $outputDirectory -ItemType Directory | Out-Null
    Write-Host "Creata la directory: $outputDirectory"
}

Per un'analisi tracciabile, lo script genera un file di testo con un timestamp unico nel nome, salvandolo nella cartella "Documenti" dell'utente. Viene anche inclusa una verifica per creare la cartella "Documenti" se non esistente, garantendo che l'operazione di scrittura del file avvenga senza errori.


4. La Funzione Ricorsiva ListAndManageFolders
Il cuore dello script è una funzione ricorsiva che attraversa l'intera gerarchia delle cartelle:

Function ListAndManageFolders {
    param(
        [Parameter(Mandatory=$true)]
        [object]$Folders, # Collezione di oggetti Outlook.Folder
        [string]$Indent = "" # Stringa per l'indentazione gerarchica
    )

    foreach ($folder in $Folders) {
        $propertyAccessor = $null

        try {
            if ($folder -eq $null) {
                Write-Warning "Trovato un oggetto cartella nullo, saltato."
                continue
            }
            if ($folder.DefaultMessageClass -eq "IPM.Note") {
                if ($folder.Folders.Count -gt 0) {
                    ListAndManageFolders -Folders $folder.Folders -Indent ($Indent + "  ")
                }
                $propertyAccessor = $folder.PropertyAccessor
                $isHidden = $false
                try {
                    $isHidden = $propertyAccessor.GetProperty($hiddenFolderPropName)
                }
                catch {
                    Write-Verbose "Impossibile leggere la proprietà nascosta per la cartella $($folder.FullFolderPath). Assunta non nascosta."
                    $isHidden = $false
                }
                if ($isHidden -ne $true) {
                    $outputLine = "$Indent$($folder.FullFolderPath) ($($folder.Items.Count) elementi)"
                    $outputLine | Out-File -FilePath $outputPath -Append -Encoding UTF8
                    Write-Host $outputLine
                    if ($folder.Items.Count -eq 0 -and $folder.Folders.Count -eq 0) {
                        Write-Host "$Indent   [ELIMINAZIONE] Cartella vuota rilevata: $($folder.Name)" -ForegroundColor Yellow
                        try {
                            $folder.Delete()
                            Write-Host "$Indent   [SUCCESSO] Cartella eliminata: $($folder.Name)" -ForegroundColor Green
                        }
                        catch {
                            Write-Error "$Indent   [ERRORE] Impossibile eliminare la cartella $($folder.Name): $($_.Exception.Message)"
                        }
                    }
                }
            }
        }
        catch {
            Write-Error "Errore durante l'elaborazione della cartella '$($folder.FullFolderPath)': $($_.Exception.Message)"
        }
        finally {
            if ($propertyAccessor -ne $null) {
                [System.Runtime.InteropServices.Marshal]::ReleaseComObject($propertyAccessor) | Out-Null
            }
        }
    }
}

- Filtro per Tipo di Cartella: if ($folder.DefaultMessageClass -eq "IPM.Note") assicura che vengano elaborate solo le cartelle destinate ai messaggi di posta (incluse le cartelle RSS), escludendo calendari, contatti, ecc.

- Rilevamento Cartelle Nascoste: Viene utilizzata la proprietà MAPI http://schemas.microsoft.com/mapi/proptag/0x10F4000B (corrispondente a PR_ATTR_HIDDEN) per identificare le cartelle nascoste di sistema. Queste vengono ignorate per evitare modifiche indesiderate.

- Output e Visualizzazione: Per ogni cartella visibile, il suo percorso completo e il conteggio degli elementi vengono scritti sia nel file di output che nella console, con un'indentazione che riflette la gerarchia.

- Logica di Eliminazione:
if ($folder.Items.Count -eq 0 -and $folder.Folders.Count -eq 0) {
    Write-Host "$Indent   [ELIMINAZIONE] Cartella vuota rilevata: $($folder.Name)" -ForegroundColor Yellow
    try {
          $folder.Delete()
          Write-Host "$Indent   [SUCCESSO] Cartella eliminata: $($folder.Name)" -ForegroundColor Green
    }
    catch {
           Write-Error "$Indent   [ERRORE] Impossibile eliminare la cartella $($folder.Name): $($_.Exception.Message)"
    }
}

Questa sezione è cruciale e potenzialmente distruttiva. La cartella viene eliminata solo se è completamente vuota (zero elementi e zero sottocartelle). Viene fornito un feedback visivo e una robusta gestione degli errori per ogni tentativo di eliminazione.

Output
FIG 2 - Output



5. Gestione degli Oggetti COM e Pulizia
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($startFolder) | Out-Null # Rilascia la cartella di partenza
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($mapiNamespace) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($outlookApp) | Out-Null

Un aspetto critico della programmazione con oggetti COM è la gestione della memoria. A differenza degli oggetti .NET, gli oggetti COM non vengono automaticamente rilasciati dal garbage collector di PowerShell. Non rilasciare questi oggetti può portare a perdite di memoria, blocchi di Outlook o processi "fantasma" in background. Lo script include chiamate esplicite a [System.Runtime.InteropServices.Marshal]::ReleaseComObject() per ogni oggetto COM creato, garantendo una pulizia efficiente delle risorse.


Considerazioni Importanti:

Backup: Prima di eseguire qualsiasi script che comporti l'eliminazione di dati, è fondamentale eseguire un backup completo della casella di posta o del file PST.

Autorizzazioni: Lo script deve essere eseguito con un utente che abbia le autorizzazioni necessarie per interagire con Outlook e per eliminare le cartelle.

Parametro -WhatIf: Per future evoluzioni, si potrebbe considerare di aggiungere un parametro -WhatIf alla funzione di eliminazione, permettendo agli amministratori di simulare l'eliminazione senza effettivamente apportare modifiche.