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.






lunedì 21 luglio 2025

Windows: Individuare quale utente ha installato o rimosso un programma

In ambienti IT complessi e distribuiti, dove molteplici amministratori operano su un'infrastruttura condivisa, la necessità di mantenere una tracciabilità dettagliata delle modifiche al software è cruciale. Ogni modifica al parco software di un'azienda, sia essa un'installazione o una disinstallazione, può avere implicazioni significative. L'introduzione di nuove applicazioni può portare a vulnerabilità di sicurezza se non gestite correttamente, mentre la rimozione non autorizzata di software essenziale può causare interruzioni operative. Identificare rapidamente l'autore di tali azioni non solo facilita l'audit e la conformità normativa, ma permette anche una risposta tempestiva a eventuali problemi di configurazione o di sicurezza.

MsiInstaller e Registo Eventi di Windows

Il sistema operativo Windows, attraverso il suo meccanismo di logging degli eventi, registra in dettaglio le attività svolte. In particolare, quando si installano o disinstallano applicazioni "classiche" basate sul programma di installazione MSI (Microsoft Installer), eventi specifici vengono scritti nel log di sistema. Il provider `MsiInstaller` è il principale responsabile della registrazione di queste operazioni.

Due eventi chiave nel log "Applicazione" sono di particolare interesse:
  • ID Evento 11707: Indica il completamento con successo dell'installazione di un'applicazione MSI.
  • ID Evento 11724: Indica la disinstallazione di un'applicazione MSI.

Analisi Manuale tramite il Visualizzatore Eventi

Per iniziare l'indagine, è possibile utilizzare la console del Visualizzatore eventi di Windows (eventvwr.msc). Una volta aperta, seguire questi passaggi:
  1. Navigare su Registri di Windows->Applicazione.
  2. Nel pannello di destra, selezionare Filtra registro corrente....
  3. Nel campo "ID evento:", inserire '11707, 11724'.
  4. Nel campo "Origini evento:", selezionare 'MsiInstaller'.
  5. Cliccare su OK.
Filtro registro corrente
FIG 1 - Filtro registro corrente


Verrà visualizzato un elenco filtrato di eventi relativi all'installazione e alla rimozione di programmi. Ogni evento contiene una descrizione dettagliata dell'operazione, inclusi il nome del prodotto coinvolto e l'esito. Ad esempio:
Product: Python 3.13.5 Add to Path (64-bit) -- Installation completed successfully.
Prodotto: Adobe Acrobat Reader - Italiano -- Removal completed successfully.

La proprietà "Utente" di ogni evento rivela l'account che ha eseguito l'azione, fornendo immediatamente la necessaria attribuzione.
Registro Eventi Applicazione, Origine MsiInstaller
FIG 2 - Registro Eventi Applicazione, Origine MsiInstaller

Automazione con PowerShell per una Ricerca Rapida

Per ambienti con un elevato volume di eventi o per necessità di automazione, PowerShell offre un metodo più efficiente per interrogare i log degli eventi. Il seguente script PowerShell permette di filtrare rapidamente gli eventi di installazione e disinstallazione per un'applicazione specifica, fornendo il nome utente associato:

Get-WinEvent -FilterHashtable @{LogName="Application"; ID=11707,11724; ProviderName='MsiInstaller'} | Where-Object { $_.Message -like '*NomeApplicazione*' } | Select TimeCreated, @{Name='Username'; Expression={(New-Object System.Security.Principal.SecurityIdentifier($_.userid)).Translate([System.Security.Principal.NTAccount]).Value}}, Message

Sostituire `'*NomeApplicazione*'` con una parte del nome del programma che si desidera tracciare (ad esempio, `'*Python*'`).


Get-WinEvent -FilterHashtable @{...}
Questo cmdlet è utilizzato per recuperare eventi dai log di Windows.

LogName="Application"
Specifica il log degli eventi "Applicazione".

ID=11707,11724
Filtra per gli ID evento di installazione e disinstallazione.

ProviderName='MsiInstaller'
Limita la ricerca agli eventi generati dal provider MsiInstaller.

Where-Object { $_.Message -like '*NomeApplicazione*' }
Filtra ulteriormente gli eventi in base al contenuto del messaggio, cercando il nome dell'applicazione di interesse.

Select TimeCreated, @{Name='Username'; Expression={(New-Object System.Security.Principal.SecurityIdentifier($_.userid)).Translate([System.Security.Principal.NTAccount]).Value}}, Message
Seleziona le proprietà desiderate:
  • TimeCreated: L'ora in cui l'evento è stato generato.
  • Username: Questa è una proprietà calcolata. Il campo 'userid' nell'evento contiene il Security Identifier (SID) dell'utente. Questa espressione PowerShell converte il SID in un nome di account utente leggibile ('NTAccount'), rendendo l'informazione immediatamente utile.
  • Message: Il messaggio completo dell'evento, contenente i dettagli dell'operazione.
PowerShell, Get-WinEvent
FIG 3 - PowerShell, Get-WinEvent


Considerazioni Aggiuntive e Best Practices

  • Log Retention Policy: Assicurarsi che la policy di conservazione dei log degli eventi sia adeguatamente configurata per mantenere i dati per un periodo sufficiente. Una policy troppo restrittiva potrebbe causare la sovrascrittura di informazioni preziose.
  • Gestione Centralizzata dei Log: In ambienti di grandi dimensioni, è consigliabile implementare un sistema centralizzato di gestione dei log (SIEM o un log collector dedicato). Questo non solo facilita la ricerca e l'analisi su più sistemi, ma migliora anche la sicurezza dei log, proteggendoli da manipolazioni locali.
  • Alternative di Installazione: È importante notare che questo metodo è primariamente efficace per installazioni e disinstallazioni che utilizzano l'installer MSI. Software installati tramite altri metodi (ad esempio, XCOPY deployment, Windows Store Apps, o script personalizzati) potrebbero non generare eventi MsiInstaller e richiedere metodi di monitoraggio alternativi.
  • Least Privilege: Implementare sempre il principio del privilegio minimo per gli account utente e di servizio. Questo riduce la superficie di attacco e limita le possibilità di modifiche non autorizzate al software.




venerdì 18 luglio 2025

Windows: Scrivere i log nel Visualizzatore eventi di Windows con PowerShell e CMD

Il Registro Eventi di Windows è uno strumento integrato nel sistema operativo che registra eventi, errori e avvisi relativi a diverse componenti del sistema e alle applicazioni installate. Questi registri sono fondamentali per il monitoraggio del sistema, la diagnostica dei problemi e la sicurezza e sono accessibili attraverso il Visualizzatore Eventi (Event Viewer) anch'esso incluso nel sistema operativo .

Per le nostre applicazioni/script, anziché affidarci esclusivamente a file di log testuali, possiamo sfruttare le potenzialità del registro eventi di Windows.

In questo articolo vedremo come scrivere informazioni nel Registro Eventi utilizzando PowerShell e il Prompt dei Comandi (CMD), due strumenti indispensabili per ogni amministratore di sistema.

1. Scrivere Eventi con PowerShell

Il cmdlet principale per scrivere eventi nel Visualizzatore Eventi è 
Write-EventLog

Per scrivere un evento informativo nel  registro eventi Applicazione si può utilizzare il comando:
Write-EventLog -LogName Application -Source "Application" -EntryType Information -EventID 1 -Message "Messaggio personalizzato"

-LogName:
Specifica il nome del registro eventi di destinazione (es. "Application", "System", "Security").
-Source:
Definisce l'origine dell'evento. Se l'origine non esiste, PowerShell tenterà di crearla, ma è buona pratica crearla esplicitamente prima.
-EntryType:
Indica il tipo di evento. I valori accettati sono: Error, Information, FailureAudit, SuccessAudit, Warning.
-EventID:
Specifica un identificatore numerico per l'evento, utile per la categorizzazione e il filtraggio.
-Message:
Il testo descrittivo dell'evento.
PowerShell, Creare un evento nel Registro Eventi
FIG 1 - PowerShell, Creare un evento nel Registro Eventi

Visualizzatore Eventi
FIG 2 - Visualizzatore Eventi

Creazione e Utilizzo di una Origine Evento Personalizzata
Per una migliore organizzazione e identificazione, è consigliabile creare un'origine evento personalizzata per i propri script. Questo permette di filtrare facilmente gli eventi generati dalle proprie applicazioni.

Per creare una nuova origine evento:
New-EventLog -LogName Application -Source "MioScript"

Questo comando registra "MioScript" come nuova origine nel registro eventi "Applicazione".

Per scrivere un evento con l'origine personalizzata:
Write-EventLog -LogName Application -Source "MioScript" -EntryType Warning –EventID 1 –Message "Messaggio personalizzato"
Creazione e utilizzo di una origine evento personalizzata
FIG 3 - Creazione e utilizzo di una origine evento personalizzata

Dopo aver eseguito questi comandi, aprire il Visualizzatore Eventi (digitando eventvwr.msc nella finestra Esegui o nel Prompt dei Comandi), espandere "Registri di Windows" quindi selezionare il registro "Applicazione" e verificare la presenza del nuovo evento con la descrizione personalizzata.
Visualizzatore eventi, Evento con origine personalizzata
FIG 4 - Visualizzatore eventi, Evento con origine personalizzata


Gestione dei Registri Eventi Personalizzati
Oltre ai Registri Eventi predefiniti, è possibile crearne di personalizzati per raggruppare eventi specifici. Questo è particolarmente utile per applicazioni complesse o per la segregazione dei log.

Il cmdlet New-EventLog consente anche di creare un intero log eventi personalizzato, specificando più origini associate:
New-EventLog -LogName MioRegistroEventi -source 'Origine1','Origine2','Origine3'


Importante: Affinché un nuovo log eventi personalizzato appaia nel Visualizzatore Eventi, è necessario inviargli almeno un evento.

Quando si scrivono eventi in un registro eventi personalizzato, è una buona pratica verificare se il registro esiste già per evitare errori:

If ([System.Diagnostics.EventLog]::SourceExists('MioRegistroEventi') -eq $False) {
 New-EventLog -LogName MioRegistroEventi -source 'Origine1','Origine2','Origine3'
}
Write-EventLog -LogName MioRegistroEventi -Source Origine1 -EntryType Information -EventID 1 -Message "Test"

Un nuovo file .evtx verrà creato nella cartella %SystemRoot%\System32\Winevt\Logs per ogni registro personalizzato.

All'interno del Visualizzatore Eventi il nuovo registro eventi sarà visibile all'interno di "Registri applicazioni e servizi".
Nuovo Registro Eventi
FIG 5 - Nuovo Registro Eventi



2. Scrivere Eventi con CMD

Per gli script batch (.bat/.cmd), lo strumento da utilizzare è eventcreate.exe.

Per aggiungere un evento informativo al registro eventi "Applicazione":
eventcreate /t information /l application /id 1 /d "Messaggio personalizzato"

/t
Specifica il tipo di evento (es. ErrorInformationSuccessWarning).
/l:
Indica il nome del registro eventi di destinazione (es. "Application", "System", "Security").
/id:
L'ID numerico dell'evento.
/d:
La descrizione dell'evento.

EventCreate, Creazione Evento da Prompt dei Comandi
FIG 6 - EventCreate, Creazione Evento da Prompt dei Comandi



3. Query e Filtraggio dei Registri Eventi

Una volta che gli eventi sono stati registrati, il cmdlet Get-WinEvent è lo strumento più potente per cercarli e filtrarli in PowerShell. Questo cmdlet è più moderno e versatile rispetto a Get-EventLog (che opera solo sui log classici).
Get-WinEvent -FilterHashtable @{logname='MioRegistroEventi';id=1}|ft TimeCreated,Id,Message | Select-Object -First 15

Questa query filtra gli eventi nel log "MioRegistroEventi" con EventID pari a 1 e visualizza le prime 15 occorrenze, mostrando la data di creazione, l'ID e il messaggio.
PowerShell, Query registro eventi
FIG 7 - PowerShell, Query registro eventi



4. Considerazioni

Considerazioni su PowerShell Core
Nelle versioni più recenti di PowerShell Core (7.x e successive), il cmdlet Write-EventLog non è supportato nativamente per impostazione predefinita. Tentare di usarlo genererà un errore.

Per usare Write-EventLog in PowerShell Core, è necessario importare il modulo Microsoft.PowerShell.Management con l'opzione -UseWindowsPowerShell:

Import-Module Microsoft.PowerShell.Management -UseWindowsPowerShell

Questo consente a PowerShell Core di accedere ai cmdlet di gestione specifici di Windows PowerShell.


Permessi di Accesso
Per scrivere eventi nel Visualizzatore Eventi utilizzando Write-EventLog o eventcreate.exe, l'account utente che esegue lo script deve essere membro del gruppo Administrators locale. Un utente non amministratore può solo inviare eventi a log eventi personalizzati che sono stati creati da un amministratore.




mercoledì 16 luglio 2025

Google Easter Egg: Pac-man

Il 21 maggio 2010, per celebrare il 30° anniversario di Pac-Man, Google pubblicò sulla propria homepage un nuovo Doodle che consisteva in una versione completamente giocabile dell'iconico videogioco.

Il doodle giocabile è ancora accessibile, basta ricercare dalla homepage di Google la parola chiave pacman o pac-man.
Pac-man
FIG 1 - Pac-man


Il doodle giocabile è accessibile direttamente anche da https://www.google.com/logos/2010/pacman10-i.html mentre maggiori informazioni sul doodle sono consultabili dalla seguente pagina https://doodles.google/doodle/30th-anniversary-of-pac-man/.





martedì 15 luglio 2025

MS Outlook: Errore "Memoria Insufficiente" alla selezione di una cartella

Durante l'utilizzo delle versioni del client di posta Microsoft Outlook (in particolare Outlook 2010, Outlook 2013, Outlook 2016 e Outlook 2019), gli utenti potrebbero riscontrare un errore indicante "memoria insufficiente" al momento di accedere a una cartella specifica. Tale anomalia si manifesta tipicamente con messaggi di errore del tipo

Messaggio di errore 1
  • "Memoria disponibile insufficiente per eseguire questo programma. Chiudere uno o più programmi e riprovare."
  • "There is not enough free memory to run this program. Quit one or more programs, and then try again."

Messaggio di errore 2
  • "Impossibile visualizzare la cartella. Memoria disponibile insufficiente per eseguire questo programma. Chiudere uno o più programmi e riprovare."
  • "Unable to display the folder. There is not enough free memory to run this program. Quit one or more programs, and then try again."

Messaggio di errore 3
  • "Impossibile visualizzare la cartella. Memoria disponibile insufficiente per eseguire questo programma. Chiudere uno o più programmi e riprovare."
  • "Cannot display the folder. There is not enough free memory to run this program. Quit one or more programs, and then try again."

I messaggi possono variare leggermente nella formulazione, ma il nucleo del problema rimane lo stesso.
MS Outlook



Possibili cause del problema
Questo errore si verifica a causa di una carenza di memoria disponibile per visualizzare la cartella desiderata. Le ragioni possono essere molteplici e spesso interconnesse:
  • Personalizzazioni delle Viste: Una delle cause principali è legata alle personalizzazioni applicate alle viste delle cartelle, come l'impostazione di filtri complessi o raggruppamenti. Queste modifiche possono richiedere una quantità maggiore di memoria per essere elaborate.
  • Gestione degli Add-in: Molti add-in di Outlook, sebbene utili, possono sottoscrivere un numero elevato di cartelle in diverse posizioni all'interno del profilo utente. Ogni sottoscrizione MAPI (Messaging Application Programming Interface) consuma una porzione di memoria condivisa. Una combinazione elevata di elementi e cartelle, unita a un numero considerevole di sottoscrizioni da parte degli add-in, può facilmente esaurire la memoria disponibile per il client.
  • File di Dati PST di Grandi Dimensioni: La presenza di file di dati di Outlook (.pst) estremamente grandi e con un numero elevato di cartelle può anch'essa contribuire all'esaurimento della memoria, soprattutto se questi file sono attivi e in fase di indicizzazione o sincronizzazione.


Workaround
Per mitigare l'errore di "memoria insufficiente", la strategia principale consiste nell'aumentare la memoria heap disponibile per le sottoscrizioni MAPI. Questa operazione richiede una modifica del Registro di sistema di Windows:
  • Assicurarsi che Outlook sia completamente chiuso prima di iniziare.
  • 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 alla Sottocartella del Sottosistema di Messaggistica di Windows
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem
  • Creare il Valore DWORD (32-bit) SharedMemMaxSize.
  • Cliccare con il tasto destro su SharedMemMaxSize e selezionare Modifica. Nel campo Dati valore, digitare 300000. Assicurarsi che l'opzione Base sia impostata su Esadecimale e cliccare su OK.

    SharedMemMaxSize
    FIG 1 - SharedMemMaxSize

  • Navigare alla Sottocartella di Outlook 
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\Applications\Outlook
    Se le sottocartelle Applications e Outlook non esistono, sarà necessario crearle manualmente.
  • Creare un secondo Valore DWORD (32-bit) SharedMemMaxSize (se necessario).
  • Cliccare con il tasto destro su SharedMemMaxSize e selezionare Modifica. Nel campo Dati valore, digitare 300000. Anche in questo caso, assicurarsi che l'opzione Base sia impostata su Esadecimale prima di cliccare su OK
  • Uscire dall'Editor del Registro di Sistema

Se impostare entrambi i valori del Registro di sistema a 0x300000 (equivalente esadecimale di 3.145.728 in decimale) non risolve il problema, è possibile aumentare ulteriormente questi valori fino a 0x800000 (equivalente esadecimale di 8.388.608 in decimale).

Oltre alla modifica del Registro di sistema, esistono altre strategie che possono contribuire a risolvere o prevenire l'errore di memoria:
  • Gestione dei File PST/OST: Se si utilizzano file di dati Outlook (.pst o .ost) di grandi dimensioni, considerare le seguenti azioni:
    - Chiusura dei file non necessari: Chiudere i file .pst che non sono attivamente utilizzati.
    - Riduzione del numero di cartelle: Ottimizzare la struttura delle cartelle, riducendo il numero complessivo di sottocartelle, specialmente in file di dati molto grandi. Archiviare le vecchie email può essere d'aiuto.
  • Revisione e disabilitazione degli Add-in:
    Disabilitazione Selettiva: Disabilitare temporaneamente gli add-in uno per uno per identificare quello che potrebbe causare il problema.
    Disinstallazione degli Add-in non essenziali: Rimuovere gli add-in che non sono più necessari o che mostrano comportamenti anomali.