2009-10-16 8 views
31

Ich versuche, einen Dienst bereitzustellen, den ich geschrieben habe. Hier ist die InstallLog-Datei:Installieren eines selbst entwickelten Windows-Dienstes

Wie Sie sehen können, funktioniert es nicht. Ich bin mir nicht sicher, wie es weitergehen soll und bin mit Bing und Google an die Wand gegangen. Ich habe das Konto auf LocalSystem für den ServiceProcessInstaller1 festgelegt. Der Code kompiliert gut, aber jetzt möchte ich das Ding laufen lassen ... irgendwelche Ideen? Ich bin ein Administrator auf meiner Box, und ich bin mit dem Befehl:

InstallUtil TweetLinkQueue.exe

aus der VS2008 Admin-Konsole.

AKTUALISIERT MIT/ShowCallStack Option

Call Stack

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) 

und hier ist der Konstruktor:

public TweetLinkService() 
{ 
    InitializeComponent(); 

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

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

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

AKTUALISIERT mit Einsprungpunkt:

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

Sie erhalten Sie weitere Informationen, wenn Sie installutil mit der/ShowCallStack Option laufen? – itowlson

+0

Die Protokolldatei Info ist in der obigen Frage. –

+0

Verfügt der Benutzer, mit dem Sie versuchen, den Dienst zu installieren, über Berechtigungen zum Schreiben in das Sicherheitsereignisprotokoll? – Oded

Antwort

13

Ich bin nicht sicher, was dein spezifisches Problem ist. Es sieht für mich so aus, als ob das Problem beim Erstellen der EventLog-Quelle auftritt. Überprüfen Sie, ob Sie dieses Teil korrekt ausgeführt haben. Sie können auf die Schritt-für-Schritt-Anleitung here verweisen. BEARBEITEN SIE: SPEZIELL AUF SCHRITT 9 SCHAUEN. Das Problem tritt möglicherweise auf, weil Sie mit dem Anwendungsprotokoll statt mit einem für Ihre Anwendung spezifischen Problem konfrontiert werden.

Es ist nichts falsch an der Verwendung von InstallUtil, aber wenn Sie Ihren Dienst auf einem fremden Computer installieren müssen, ist InstallUtil nicht garantiert dort zu sein. Sie können diese Schritt-für-Schritt-Anleitung ausführen, um Ihre Windows-Dienstprogrammdatei ohne InstallUtil installieren/deinstallieren zu lassen. Für diese Anweisungen siehe here.

2

Das Konto "LocalSystem" ist normalerweise nicht berechtigt, das Sicherheitsereignisprotokoll zu lesen (oder Ereignisquellen zu erstellen).

Die einfachste und sicherste Lösung besteht darin, ein Ereignisquelleninstallationsprogramm zu erstellen, das Sie unter Ihren eigenen Anmeldeinformationen auf Administratorebene auf jedem Computer ausführen können, für den Sie das ausführen möchten. Es könnte sogar einen Versuch wert sein, um zu testen, ob Ihr Konto die Erlaubnis dazu hat.

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

Wenn Sie das ausführen, ist es erfolgreich? Sie können dies überprüfen, indem Sie sich die Eigenschaften des Anwendungsprotokolls ansehen und die Ereignisquellen auf der Registerkarte Filter durchsuchen.

Alternativ, da Dienste ohnehin installiert werden müssen, könnten Sie ein EventLogInstaller hinzufügen (was falsch benannt ist - es ist wirklich ein ‚EventSourceInstaller‘, die EventLogs nach Bedarf geschaffen werden) an die Baugruppe statt mit EventLog.CreateEventSource im Dienst des Konstruktor.

+0

Ja. In dem Code, der Schritt 9 unter http://stackoverflow.com/questions/593454/easiest-language-to-create-a-windows-service/593803#593803 folgt, finden Sie ein Beispiel wie das getan wird. –

+0

Ja - das ist definitiv ein gutes Beispiel. –

109

Ich hatte gerade dieses Problem und es war, weil ich meine Visual Studio-Eingabeaufforderung nicht als Administrator ausgeführt habe.

+8

Dies sollte als Antwort markiert werden. –

+0

dies erklärt, warum es auf meiner Maschine gearbeitet, aber nicht auf die Produktion – TruthOf42

+2

ich eine BAT-Datei für die Installation des Service erstellt und ich die BAT-Datei als Administrator ausgeführt wurde (rechts auf BAT-Datei klicken und klicken Sie auf Option „als Administrator ausführen“), aber es hat nicht gearbeitet. Damit es funktioniert, lief ich als Administrator eine Command Line Prompt (cmd.exe) anstelle der BAT-Datei. Dann habe ich es manuell installiert und es hat funktioniert. –

8

Um dieses Problem zu lösen, klicken Sie mit der rechten Maustaste auf Ihre Visual Studio 2008-Eingabeaufforderung und klicken Sie auf Ausführen als Administrator, dann führen Sie Ihren Befehl wie installutil C: \ mcWebService \ bin \ Debug \ mcWebService.exe dann zeigt es Ihnen eine erfolgreiche Nachricht. Hoffe das wird Ihre Lösung lösen.

0

Mein Problem war ein Fenster Anmeldeinformationen einzugeben, wurde knallend und ich ohne die Domain meine Benutzername eintritt. Sobald ich Domäne \ Benutzername eingegeben habe, war alles in Ordnung.

Verwandte Themen