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.





mercoledì 23 luglio 2025

Windows 11: Elevare i Privilegi con sudo

L'introduzione del comando sudo in Windows 11, a partire dalla build 24H2, segna un'evoluzione significativa nella gestione dei privilegi all'interno dell'ambiente Microsoft. Questo strumento, familiare agli utenti di sistemi basati su Unix e Linux, consente agli amministratori di sistema e agli sviluppatori di eseguire comandi con privilegi elevati direttamente da sessioni CMD, PowerShell o Terminale non privilegiate. Questa integrazione mira a semplificare i flussi di lavoro, riducendo la necessità di avviare manualmente sessioni separate con diritti di amministratore.

Abilitazione di sudo in Windows 11

Per impostazione predefinita, il comando sudo è disabilitato in Windows 11. L'attivazione è un processo semplice e può essere eseguita tramite l'interfaccia grafica delle Impostazioni o tramite il Registro di Sistema.

Metodo 1 - Tramite Impostazioni
Navigare in Impostazioni->Sistema->Per sviluppatori e attivare l'interruttore Abilita sudo.
Abilita sudo
FIG 1 - Abilita sudo


Metodo 2 - Tramite registro di sistema
Per un'automazione o una configurazione di gruppo, è possibile modificare il Registro di Sistema con il seguente comando:    
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Sudo" /v "Enabled" /t REG_DWORD /d 1 /f


Principio di Funzionamento e Vantaggi

Tradizionalmente, l'esecuzione di comandi che richiedono privilegi amministrativi in una console non elevata avrebbe generato un errore di "Accesso negato". Ad esempio, tentare di riavviare un servizio Windows con 
Restart-Service wsearch 
da una sessione PowerShell standard fallirebbe. 

Privilegi non sufficienti
FIG 2 - Privilegi non sufficienti

Con sudo, questo scenario cambia radicalmente. 
Una volta abilitato, l'esecuzione di un comando preceduto da sudo ad esempio
sudo powershell "Restart-Service wsearch"
innesca una richiesta di Controllo Account Utente (UAC). Dopo l'approvazione, il comando viene eseguito in una nuova finestra del terminale (separata dalla sessione corrente) con i diritti amministrativi necessari.
sudo
FIG 3 - sudo


Controllo Account Utente (UAC)
FIG 4 - Controllo Account Utente (UAC)



A differenza del comando runas, sudo non richiede l'inserimento di una password di amministratore direttamente nella riga di comando. La conferma avviene tramite il prompt UAC, che autentica l'elevazione per l'utente corrente senza permettere la selezione di un account utente diverso. Questa implementazione migliora la sicurezza, evitando che le credenziali vengano esposte in testo chiaro o nella cronologia dei comandi.

Il medesimo principio si applica alle sessioni CMD. Tentare 
net stop wsearch
da un prompt dei comandi non elevato genererà un "Errore di sistema 5. Accesso negato." L'utilizzo di 
sudo net stop wsearch
risolverà l'errore, elevando i privilegi per l'esecuzione del comando.
Accesso negato
FIG 5 - Accesso negato


Prima dell'introduzione di sudo, gli utenti dovevano ricorrere a metodi meno efficienti per eseguire comandi elevati. Ad esempio, lanciare una nuova finestra del Prompt dei comandi con "Esegui come amministratore" o, per PowerShell, utilizzare "Start-Process powershell -Verb runAs". 
Sudo semplifica drasticamente questo processo, integrando l'elevazione dei privilegi direttamente nel flusso di lavoro della console esistente.


Modalità di esecuzione di sudo

Sudo per Windows offre tre diverse modalità di esecuzione, configurabili tramite l'applicazione Impostazioni o specificabili direttamente dalla riga di comando, per adattarsi a diverse esigenze di sicurezza e operatività.
Modalità di esecuzione di sudo
FIG 6 - Modalità di esecuzione di sudo


Modalità di esecuzione:
  1. In una nuova finestra: Questa è la modalità predefinita. Quando un comando o un programma viene eseguito tramite sudo, si apre in una nuova finestra, operando con i diritti di amministratore. Da riga di comando eseguire
    sudo config --enable forceNewWindow
  2. Con input disabilitato: Considerata l'opzione più sicura. Il comando viene eseguito con privilegi elevati all'interno della finestra corrente, ma senza la capacità di ricevere o richiedere input utente da quella sessione. Questo previene potenziali attacchi di iniezione di input in sessioni elevate. Da riga di comando eseguire 
    sudo config --enable disableInput
  3. Inline:Questa modalità emula il comportamento del comando sudo sui sistemi Linux e Unix. Il comando elevato viene eseguito nella console corrente e può ricevere input da essa. Sebbene sia l'opzione più comoda per interazioni dirette, è anche quella meno sicura, poiché un processo elevato potrebbe potenzialmente essere manipolato da input non sicuri. Da riga di comando eseguire
    sudo config --enable normal

Indipendentemente dalla modalità predefinita configurata, è sempre possibile forzare l'esecuzione di un comando elevato nella console corrente utilizzando l'opzione --inline. Ad esempio:
sudo --inline net stop wsearch


Conclusione

L'integrazione del comando sudo in Windows 11 rappresenta un passo significativo verso la modernizzazione dell'interfaccia a riga di comando di Microsoft. Offrendo un meccanismo flessibile e sicuro per l'elevazione dei privilegi, sudo migliora l'efficienza per sviluppatori e amministratori di sistema, allineando l'esperienza utente a quella offerta da altri sistemi operativi e promuovendo pratiche di sicurezza migliori attraverso l'uso ponderato di UAC. Per un elenco completo delle opzioni e dei parametri supportati, è sufficiente eseguire nel terminale il comando
sudo -h
Visualizza guida
FIG 7 - Visualizza guida







martedì 22 luglio 2025

Nuovo Outlook: Resettare il profilo

Attivando il nuovo Outlook, le informazioni relative agli account vengono automaticamente importate dal profilo Outlook esistente. Per aggiungere o rimuovere account dal nuovo Outlook è possibile procedere tramite il menu Impostazioni -> Account -> I tuoi account.
New Outlook, I tuoi account
FIG 1 - New Outlook, I tuoi account

Il nuovo Outlook per Windows supporta fino a 10 account, inclusi account Outlook.com e account Exchange di Microsoft 365 per aziende, nonché account IMAP e POP. Inoltre, gli account Gmail, iCloud e Yahoo sincronizzano anche calendario e contatti memorizzati sul server di posta.


Reset del profilo

Per ripartire da zero con un profilo completamente nuovo, il semplice "reset" dell'app non basta e non rimuoverà il profilo attuale. Per eliminare il profilo e le impostazioni e ricominciare con una configurazione pulita, seguire questi passaggi:
  1. Chiudere l'applicazione "Nuovo Outlook".
  2. Aprire il menu Start, selezionare "Esegui" (oppure utilizzare a combinazione WIN+R). 
  3. Digitare il seguente comando seguito da Invio:
    olk.exe --clearLocalState
  4. Rispondere affermativamente alla finestra di dialogo con la richiesta di conferma.

    Clear Outlook Local State
    FIG 2 - Clear Outlook Local State

  5. Dopo qualche secondo, una nuova finestra di dialogo avvisa l'utente sull'esito dell'operazione.

    Clear Outlook Local State, Operazione completata
    FIG 3 - Clear Outlook Local State, Operazione completata


Il profilo è stato eliminato. Avviando il nuovo Outlook verrà chiesto di aggiungere nuovamente gli account come se si trattasse della prima configurazione.