Proyecto de configuración para un servicio de Windows y el registro de eventos
-
28-10-2019 - |
Pregunta
Obtuve un proyecto de configuración que instala un servicio de Windows.
Estamos registrando una fuente de registro de eventos en un registro personalizado que debe ser utilizado por el proyecto Winservice (cómo y por qué no es importante).
Mi problema es que el proyecto de configuración intenta crear una fuente de registro de eventos por predeterminado. Al hacerlo, es un mensaje de error ("Error 1001" source XXX already exists on local computer
) y vuelve hacia atrás.
He mirado a todas partes y no puedo encontrar dónde se realiza el registro o cómo puedo apagarlo.
¿Cómo puedo obligar al Servicio de Windows o al proyecto Configuración a no crear una fuente de registro de eventos?
Solución
Puede eliminar el valor predeterminado EventLogInstaller
:
namespace MyService
{
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
// Remove the default Event Log Installer
EventLogInstaller DefaultInstaller = null;
foreach (Installer installer in serviceInstaller1.Installers)
{
if (installer is EventLogInstaller)
{
DefaultInstaller = (EventLogInstaller)installer;
break;
}
}
if (DefaultInstaller != null)
{
serviceInstaller1.Installers.Remove(DefaultInstaller);
}
}
}
}
Alternativamente, puede modificar el Log
propiedad:
foreach (Installer installer in serviceInstaller1.Installers)
{
if (installer is EventLogInstaller)
{
((EventLogInstaller)installer).Log = "MyLog";
break;
}
}
Ahora los eventos se registrarán con éxito para Mylog, y los eventos de inicio/parada del servicio aún se registrarán en el Solicitud Iniciar sesión.
(fuente: ServiceInStaller Component y su event EventLogInstaller predeterminado)
Otros consejos
Supongo que cuando desinstalas el servicio, algo no está correctamente desinstalado, especialmente en el registro de eventos.
Para restaurar la capacidad de reinstalar el servicio nuevamente, descubrí (Gracias a este artículo) Debe eliminar esta clave en el registro (regedit.exe):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\YOURSERVICENAME
Esto es solo una suposición basada en mis pruebas.
El proyecto del instalador (o la clase Windowservice) crea una fuente de evento automáticamente con el mismo nombre que myService.ServiceName
. Esto es muy probable porque los mensajes de inicio / parada se escriben en el registro cada vez que se inicia / detiene un servicio. Y esos mensajes necesitan una fuente.
En otras palabras: no necesita crear una fuente con el mismo nombre que el nombre de servicio que se hace por usted.