2009-10-16 13 views
31

Sto tentando di distribuire un servizio che ho scritto. Ecco il file InstallLog:Installazione di un servizio Windows sviluppato autonomamente

Installing assembly 'c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe'. 
Affected parameters are: 
    logtoconsole = 
    assemblypath = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe 
    logfile = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.InstallLog 
Installing service TweetLinkService... 
Creating EventLog source TweetLinkService in log Application... 
Rolling back assembly 'c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe'. 
Affected parameters are: 
    logtoconsole = 
    assemblypath = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.exe 
    logfile = c:\Users\brwatson\Development\Projects\TweetLinks\TweetLinkQueue\bin\Debug\TweetLinkQueue.InstallLog 
Restoring event log to previous state for source TweetLinkService. 
An exception occurred during the Rollback phase of the System.Diagnostics.EventLogInstaller installer. 
System.Security.SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security. 
An exception occurred during the Rollback phase of the installation. This exception will be ignored and the rollback will continue. However, the machine might not fully revert to its initial state after the rollback is complete. 

Come si può vedere, non funziona. Non sono sicuro di come procedere e ho colpito il muro con Bing e Google. Ho impostato l'account su LocalSystem per serviceProcessInstaller1. Il codice si compila bene, ma ora mi piacerebbe eseguire la cosa ... qualche idea? Sono un amministratore sulla mia casella, e sto facendo funzionare il comando:

InstallUtil TweetLinkQueue.exe

dalla console di amministrazione VS2008.

AGGIORNATO CON opzione/ShowCallStack

Stack di chiamate

An exception occurred during the Install phase. 
System.Security.SecurityException: The source was not found, but some or all eve 
nt logs could not be searched. Inaccessible logs: Security. 
    at System.Diagnostics.EventLog.FindSourceRegistration(String source, String m 
achineName, Boolean readOnly) 
    at System.Diagnostics.EventLog.SourceExists(String source, String machineName 
) 
    at System.Diagnostics.EventLogInstaller.Install(IDictionary stateSaver) 
    at System.Configuration.Install.Installer.Install(IDictionary stateSaver) 
    at System.ServiceProcess.ServiceInstaller.Install(IDictionary stateSaver) 
    at System.Configuration.Install.Installer.Install(IDictionary stateSaver) 
    at System.Configuration.Install.Installer.Install(IDictionary stateSaver) 
    at System.Configuration.Install.AssemblyInstaller.Install(IDictionary savedSt 
ate) 
    at System.Configuration.Install.Installer.Install(IDictionary stateSaver) 
    at System.Configuration.Install.TransactedInstaller.Install(IDictionary saved 
State) 

e qui è il costruttore:

public TweetLinkService() 
{ 
    InitializeComponent(); 

    if (!EventLog.SourceExists("TweetLinkQueue")) 
    { 
     EventLog.CreateEventSource("TweetLinkQueue", "Log"); 

     TweetLinksLog.Source = "TweetLinkQueue"; 
     TweetLinksLog.Log = "Log"; 

     TweetLinksLog.WriteEntry("Log Created!"); 
    } 
} 

aggiornato con Punto di ingresso:

namespace TweetLinkQueue 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new TweetLinkService() 
      }; 
      ServiceBase.Run(ServicesToRun); 
     } 
    } 
} 
+0

Ricevi ulteriori informazioni se esegui installutil con l'opzione/ShowCallStack? – itowlson

+0

Le informazioni del file di registro si trovano nella domanda precedente. –

+0

L'utente che si sta tentando di installare il servizio dispone delle autorizzazioni per scrivere nel registro eventi di protezione? – Oded

risposta

13

Sono non sicuro qual è il tuo problema specifico. Mi sembra che il problema si verifichi durante la creazione della sorgente EventLog. Ricontrolla che hai fatto quella parte correttamente. È possibile fare riferimento alla procedura dettagliata here. MODIFICA: GUARDA PARTICOLARMENTE IL PUNTO 9. Il problema potrebbe essere dovuto al fatto che stai utilizzando il registro dell'applicazione anziché uno specifico dell'applicazione.

Non c'è niente di sbagliato nell'usare InstallUtil, ma se è necessario installare il servizio su una macchina esterna, InstallUtil non è garantito. È possibile seguire questa procedura dettagliata per rendere installa/disinstallato il proprio eseguibile del servizio Windows senza la necessità di InstallUtil. Vedi here per quelle istruzioni.

2

L'account LocalSystem normalmente non dispone dell'autorizzazione per leggere il registro eventi Security (o per creare origini evento per tale argomento).

La soluzione più semplice e sicura è quella di creare un programma di installazione di origine evento che è possibile eseguire con le proprie credenziali a livello di amministrazione su qualsiasi macchina per la quale si desidera eseguire ciò. Potrebbe anche valere la pena provare questo come un semplice test, solo per vedere se il tuo account ha il permesso di farlo.

class Program { 
    static void Main(string[] args) { 
     EventLog.CreateEventSource("TestSource", "Application"); 
    } 
} 

Se lo si esegue, ci riesce? È possibile verificarlo controllando le proprietà del registro dell'applicazione e sfogliando le origini degli eventi nella scheda Filtro.

In alternativa, dal momento che i servizi devono essere installati in ogni caso, si potrebbe aggiungere un EventLogInstaller (che è misnamed - è davvero un 'EventSourceInstaller' che creerà EventLogs se necessario) al gruppo invece di utilizzare EventLog.CreateEventSource nel costruttore del servizio.

+0

Sì. Vedere il codice seguendo il passaggio 9 all'indirizzo http://stackoverflow.com/questions/593454/easiest-language-to-create-a-windows-service/593803#593803 per un esempio su come eseguire questa operazione. –

+0

Sì, questo è sicuramente un buon esempio. –

109

Stavo avendo questo problema ed era perché non stavo eseguendo il mio prompt dei comandi di Visual Studio come amministratore.

+8

Questo dovrebbe essere contrassegnato come la risposta. –

+0

questo spiega perché ha funzionato sulla mia macchina ma non sulla produzione – TruthOf42

+2

Ho creato un file BAT per l'installazione del servizio e stavo eseguendo il file BAT come amministratore (fare clic con il pulsante destro del mouse sul file BAT e fare clic su "Esegui come amministratore") ma non funzionava Per farlo funzionare, "eseguo come amministratore" un prompt di riga di comando (cmd.exe) invece del file BAT. Quindi, l'ho installato manualmente e ha funzionato. –

8

Per risolvere questo problema, fare clic con il pulsante destro del mouse sul prompt dei comandi di Visual Studio 2008 e fare clic su Esegui come amministratore, quindi eseguire il comando come installutil C: \ mcWebService \ bin \ Debug \ mcWebService.exe quindi mostrerà il messaggio di successo. Spero che questo risolva la tua soluzione.

0

Il mio problema era che una finestra stava scoccando per inserire le credenziali e stavo inserendo il mio nome utente senza il dominio. Una volta entrato nel dominio \ username, tutto andava bene.

Problemi correlati