C# – SecurityException durante la scrittura nel registro eventi di Windows

C# – SecurityException durante la scrittura nel registro eventi di Windows

Problema

Quando la tua applicazione tenta di scrivere nel registro eventi di Windows, ottieni la seguente eccezione:

Questa eccezione si riferisce all'origine del registro eventi. Quando si scrive nel registro eventi di Windows, è necessario specificare l'origine del registro eventi da utilizzare. Se la fonte non esiste, proverà a crearla per te nel registro. Per impostazione predefinita, ciò richiede le autorizzazioni di amministratore. Se la tua applicazione non dispone delle autorizzazioni corrette, otterrai SecurityException.

Nota:ti imbatterai in questa eccezione anche quando proverai a utilizzare EventLog.SourceExists() / EventLog.CreateEventSource() se la tua app non dispone delle autorizzazioni corrette.

Soluzione

La soluzione più semplice è eseguire come amministratore almeno una volta per ottenere la registrazione dell'origine del registro eventi.

Il modo esatto in cui lo risolverai dipenderà dal tuo scenario specifico (ambiente, tipo di utenti, ecc...). Ecco alcune opzioni di seguito.

Opzione 1:esegui come amministratore durante l'installazione/distribuzione

Questo è davvero solo un problema durante la registrazione iniziale dell'origine del registro eventi. Quindi, idealmente, ti occuperai di questo durante l'installazione / distribuzione.

Esegui il programma di installazione/la distribuzione come amministratore in modo che possa registrare l'origine del registro eventi.

Opzione 2:registra l'origine del registro eventi con un'app console/PowerShell separata

Esegui PowerShell come amministratore ed esegui quanto segue per registrare l'origine del registro eventi:

[System.Diagnostics.EventLog]::WriteEntry("MySource", "initializing event log source")
Code language: PowerShell (powershell)

Oppure crea un'app console ed eseguila come amministratore:

using System.Diagnostics;

static void Main(string[] args)
{
	if (EventLog.SourceExists("MySource"))
	{
		EventLog.CreateEventSource(source: "MySource", logName: "Application");
	}
}

Code language: C# (cs)

Nota:usa EventLog.SourceExists() + EventLog.CreateEventSource() se vuoi evitare di scrivere messaggi fittizi solo per inizializzare l'origine del registro eventi.