C# – SecurityException beim Schreiben in das Windows-Ereignisprotokoll

C# – SecurityException beim Schreiben in das Windows-Ereignisprotokoll

Problem

Wenn Ihre Anwendung versucht, in das Windows-Ereignisprotokoll zu schreiben, erhalten Sie die folgende Ausnahme:

Diese Ausnahme bezieht sich auf die Quelle des Ereignisprotokolls. Wenn Sie in das Windows-Ereignisprotokoll schreiben, müssen Sie die zu verwendende Ereignisprotokollquelle angeben. Wenn die Quelle nicht vorhanden ist, wird versucht, sie für Sie in der Registrierung zu erstellen. Standardmäßig sind hierfür Administratorrechte erforderlich. Wenn Ihre Anwendung nicht über die richtigen Berechtigungen verfügt, erhalten Sie die SecurityException.

Hinweis:Sie werden auch auf diese Ausnahme stoßen, wenn Sie versuchen, EventLog.SourceExists() / EventLog.CreateEventSource() zu verwenden, wenn Ihre App nicht über die richtigen Berechtigungen verfügt.

Lösung

Die einfachste Lösung besteht darin, mindestens einmal als Administrator auszuführen, um die Ereignisprotokollquelle zu registrieren.

Wie genau Sie es lösen, hängt von Ihrem spezifischen Szenario ab (Umgebung, Benutzertyp usw.). Nachfolgend sind einige Optionen aufgeführt.

Option 1 – Beim Installieren/Bereitstellen als Administrator ausführen

Dies ist wirklich nur ein Problem beim erstmaligen Registrieren der Ereignisprotokollquelle. Idealerweise kümmern Sie sich also während der Installation/Bereitstellung darum.

Führen Sie das Installationsprogramm/die Bereitstellung als Administrator aus, damit es die Ereignisprotokollquelle registrieren kann.

Option 2 – Registrieren Sie die Ereignisprotokollquelle mit einer separaten Konsolen-App/PowerShell

Führen Sie PowerShell als Administrator aus und führen Sie Folgendes aus, um die Quelle des Ereignisprotokolls zu registrieren:

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

Oder erstellen Sie eine Konsolenanwendung und führen Sie sie als Administrator aus:

using System.Diagnostics;

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

Code language: C# (cs)

Hinweis:Verwenden Sie EventLog.SourceExists() + EventLog.CreateEventSource(), wenn Sie vermeiden möchten, eine Dummy-Nachricht zu schreiben, nur um die Quelle des Ereignisprotokolls zu initialisieren.