2011-02-02 17 views
7

Ho ottenuto un progetto di installazione che installa un servizio di Windows.Progetto di installazione per un servizio di Windows e il registro eventi

Stiamo registrando una fonte registro eventi in un log personalizzato che dovrebbe essere utilizzato dal progetto winservice (come e perché non è importante).

Il mio problema è che il progetto di installazione tenta di creare un'origine del registro eventi per impostazione predefinita. In questo modo viene visualizzato un messaggio di errore ("Error 1001" source XXX already exists on local computer) e viene eseguito il rollback.

Ho cercato ovunque e non riesco a trovare dove è stata effettuata la registrazione o come posso spegnerlo.

Come posso forzare il servizio Windows o il progetto di installazione a NON creare un'origine del registro eventi?

risposta

7

È possibile rimuovere il default 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); 
      } 
     } 
    } 
} 

In alternativa, è possibile modificare la proprietà Log:

foreach (Installer installer in serviceInstaller1.Installers) 
{ 
    if (installer is EventLogInstaller) 
    { 
     ((EventLogInstaller)installer).Log = "MyLog"; 
     break; 
    } 
} 

Ora eventi verrà registrato con successo per MyLog, e avvio del servizio/interrompere gli eventi saranno comunque registrati nel Application registro.

(fonte: serviceInstaller component and its default EventLogInstaller)

+0

Nota che è importante includere "serviceInstaller1" nella riga 'foreach (installatore Installer in serviceInstaller1.Installers)'. L'ho scritto come 'foreach (Installer Installer in this.Installers)'. Questo ha costruito bene e il progetto di installazione ha creato il file MSI. Ma l'errore persisteva quando ho provato a installare il servizio. È stato solo quando ho cambiato "this.Installers" in "serviceInstaller1.Installers" che ha corretto l'errore. –

2

Questa è solo un'ipotesi basata sui miei test.

Il progetto di installazione (o la classe WindowService) crea un'origine evento automaticamente con lo stesso nome di myService.ServiceName. Ciò è probabilmente dovuto al fatto che i messaggi Start/Stop vengono scritti nel registro ogni volta che viene avviato/fermato un servizio. E quei messaggi hanno bisogno di una fonte.

In altre parole: non è necessario creare una fonte con lo stesso nome come il ServiceName come si è fatto per voi.

3

immagino che quando si disinstalla il servizio, cosa che non viene disinstallato correttamente, soprattutto nel registro eventi.

Per ripristinare la possibilità di reinstallare il servizio ancora una volta, ho scoperto (thanks to this article) è necessario rimuovere questa chiave nel Registro di sistema (regedit.exe):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\YOURSERVICENAME 
Problemi correlati