C# – SecurityException al escribir en el registro de eventos de Windows

C# – SecurityException al escribir en el registro de eventos de Windows

Problema

Cuando su aplicación intenta escribir en el registro de eventos de Windows, obtiene la siguiente excepción:

Esta excepción hace referencia al origen del registro de eventos. Cuando escribe en el Registro de eventos de Windows, debe especificar el origen del registro de eventos que se utilizará. Si la fuente no existe, intentará crearla en el registro. De forma predeterminada, esto requiere permisos de administrador. Si su aplicación no tiene los permisos correctos, obtendrá la SecurityException.

Nota:también se encontrará con esta excepción cuando intente usar EventLog.SourceExists() / EventLog.CreateEventSource() si su aplicación no tiene los permisos adecuados.

Solución

La solución más sencilla es ejecutar como administrador al menos una vez para registrar el origen del registro de eventos.

La forma exacta en que lo resuelva dependerá de su escenario específico (entorno, tipo de usuarios, etc.). Aquí hay algunas opciones a continuación.

Opción 1:Ejecutar como administrador al instalar/implementar

Esto es realmente solo un problema cuando se registra inicialmente el origen del registro de eventos. Entonces, idealmente, se ocuparía de esto durante la instalación/implementación.

Ejecute el instalador/implementación como administrador para que pueda registrar el origen del registro de eventos.

Opción 2:registre el origen del registro de eventos con una aplicación de consola separada/PowerShell

Ejecute PowerShell como administrador y ejecute lo siguiente para registrar el origen del registro de eventos:

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

O cree una aplicación de consola y ejecútela como administrador:

using System.Diagnostics;

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

Code language: C# (cs)

Nota:utilice EventLog.SourceExists() + EventLog.CreateEventSource() si desea evitar escribir un mensaje ficticio solo para inicializar el origen del registro de eventos.