web-dev-qa-db-de.com

Fehler 1053: Der Dienst hat nicht rechtzeitig auf die Start- oder Steuerungsanforderung geantwortet

Ich habe kürzlich eine Reihe von Anwendungen geerbt, die als Windows-Dienste ausgeführt werden, und ich habe Probleme, eine GUI (über ein Kontextmenü in der Taskleiste zugänglich) für beide bereitzustellen.

Der Grund, warum wir eine GUI für einen Windows-Dienst benötigen, ist, um das Verhalten des Windows-Dienstes oder der Windows-Dienste neu konfigurieren zu können, ohne auf Stopp/Neustart zurückgreifen zu müssen.

Mein Code funktioniert gut im Debug-Modus, und ich bekomme das Kontextmenü und alles verhält sich korrekt usw.

Wenn ich den Dienst über "installutil" mit einem benannten Konto (dh nicht mit dem lokalen Systemkonto) installiere, wird der Dienst einwandfrei ausgeführt, das Symbol wird jedoch nicht in der Taskleiste angezeigt (ich weiß, dass dies normal ist, da ich dies nicht tue.) haben die Option "Mit Desktop interagieren").

Hier ist das Problem jedoch - wenn ich die Option "LocalSystemAccount" wähle und die Option "mit Desktop interagieren" markiere, braucht der Dienst AGES ohne ersichtlichen Grund zu starten, und ich bekomme einfach weiter 

Der Dienst ... konnte nicht auf dem lokalen Computer gestartet werden. 

Fehler 1053: Der Dienst hat nicht rechtzeitig auf die Start- oder Steuerungsanforderung geantwortet.

Übrigens habe ich den Windows-Service-Timeout von 30 Sekunden über einen Registry-Hack auf 2 Minuten erhöht (siehe http://support.Microsoft.com/kb/824344 , in Abschnitt 3 nach TimeoutPeriod suchen), jedoch die Dienststart noch Zeitüberschreitung.

Meine erste Frage ist, warum das Login "Local System Account" SOOOOO VIEL LÄNGER ist, als wenn sich der Dienst mit dem Nicht-LocalSystemAccount anmeldet, was zu einem Timeout des Windows-Dienstes führt. Was kann der Unterschied zwischen diesen beiden sein, um beim Start ein so unterschiedliches Verhalten zu verursachen?

Zweitens: Wenn ich einen Schritt zurück mache, versuche ich lediglich, einen Windows-Dienst bereitzustellen, der eine Konfigurationshilfe bietet. Ich würde mich sehr freuen, wenn Sie das nicht-lokale Systemkonto (mit dem benannten Benutzer/pwd) verwenden. Wenn ich den Dienst dazu bringen könnte, mit dem Desktop zu interagieren (d. h. über ein Kontextmenü in der Taskleiste). Ist das möglich und wenn ja wie?

Irgendwelche Hinweise auf die obigen Fragen wären dankbar!

57
deejjaayy

Nachdem Sie diese Nachricht tagelang bekämpft hatten, sagte mir ein Freund, dass Sie den Release-Build verwenden MÜSSEN. Wenn ich das Debugbuild installiere, wird diese Meldung angezeigt. Der Release-Build beginnt gut.

68
Marty

Wenn Sie weiterhin versuchen, Ihren Dienst direkt mit dem Desktop des Benutzers zu interagieren, verlieren Sie: Selbst unter den besten Umständen (d. H. "Vor Vista") ist dies äußerst schwierig. 

Windows verwaltet intern mehrere Fensterstationen , die jeweils über einen eigenen Desktop verfügen. Die Fensterstation, die Diensten zugewiesen ist, die unter einem bestimmten Konto ausgeführt werden, unterscheidet sich vollständig von der Fensterstation des angemeldeten interaktiven Benutzers. Der Zugriff auf Stationsfenster über Fenster hinweg war schon immer verpönt, da dies ein Sicherheitsrisiko darstellt. Während frühere Windows-Versionen einige Ausnahmen zuließen, wurden diese in Vista und späteren Betriebssystemen größtenteils eliminiert.

Der wahrscheinlichste Grund, warum Ihr Dienst beim Start hängt, ist, dass er versucht, mit einem nicht vorhandenen Desktop zu interagieren (oder davon auszugehen, dass der Explorer innerhalb der Systembenutzersitzung ausgeführt wird (was auch nicht der Fall ist)) oder auf Eingaben von einem unsichtbaren Desktop wartet . 

Das nur Eine zuverlässige Lösung für diese Probleme besteht darin, den gesamten UI-Code aus Ihrem Dienst zu entfernen und ihn in eine separate ausführbare Datei zu verschieben, die innerhalb der interaktiven Benutzersitzung ausgeführt wird (die ausführbare Datei kann beispielsweise mit der globalen Autostartgruppe gestartet werden).

Die Kommunikation zwischen Ihrem UI-Code und Ihrem Service kann mit jedem RPC-Mechanismus implementiert werden: Named Pipes eignen sich besonders gut für diesen Zweck. Wenn Ihre Kommunikationsanforderungen minimal sind, können Sie mit anwendungsdefinierten Service Control Manager-Befehlen auch den Trick ausführen.

Um diese Trennung zwischen Benutzeroberfläche und Servicecode zu erreichen, ist einige Anstrengung erforderlich. Dies ist jedoch die einzige Möglichkeit, um sicherzustellen, dass die Dinge zuverlässig funktionieren und Ihnen in Zukunft gute Dienste leisten werden.

ADDENDUM, April 2010: Da diese Frage nach wie vor sehr beliebt ist, können Sie ein weiteres häufiges Szenario beheben, bei dem Fehler "Dienst reagierte nicht ..." mit .NET-Diensten, bei denen keine witzigen Dinge wie Interaktion mit dem Desktop versucht werden tun Verwenden Sie mit Authenticode signierte Assemblys: Deaktivieren Sie die Überprüfung der Authenticode-Signatur zum Zeitpunkt des Ladens, um Publisher-Beweise zu erstellen , indem Sie Ihrer .exe.config-Datei die folgenden Elemente hinzufügen:

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

Publisher-Beweise sind eine wenig genutzte CAS-Funktion (Code Access Security): Nur in dem unwahrscheinlichen Fall, dass Ihr Dienst tatsächlich von PublisherMembershipCondition abhängt, wird die Deaktivierung dieser Funktion Probleme verursachen. In allen anderen Fällen werden die permanenten oder intermittierenden Startfehler beseitigt, da die Laufzeit nicht mehr kostspielige Zertifikatsprüfungen (einschließlich Sperrlistenabfragen) erfordert.

29
mdb

Ich habe dieses Problem aufgrund eines fehlenden Frameworks auf der Box, auf dem mein Dienst ausgeführt wird, konfrontiert. Die Box hatte .NET 4.0 und der Dienst wurde auf .NET 4.5 geschrieben. 

Ich habe den folgenden Download in der Box installiert, neu gestartet und der Dienst wurde ordnungsgemäß gestartet: http://www.Microsoft.com/en-us/download/details.aspx?id=30653

18
wbennett

Um den Start Ihres Dienstes zu debuggen, fügen Sie oben in der OnStart()-Methode Ihres Dienstes Folgendes hinzu:

 while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100);

Dadurch wird der Dienst angehalten, bis Sie den Visual Studio Debugger manuell mit Debug -> Attach to Process ... anhängen.

Hinweis: Wenn Sie einen Benutzer benötigen, um mit Ihrem Dienst zu interagieren, ist es besser, die GUI-Komponenten in eine separate Windows-Anwendung aufzuteilen, die ausgeführt wird, wenn sich der Benutzer anmeldet andere Form von IPC, um die Kommunikation zwischen der GUI-App und Ihrem Dienst herzustellen. Dies ist in der Tat die only - Möglichkeit, die dies in Windows Vista möglich ist.

12
Jacob

In der Serviceklasse der OnStart-Methode wird kein großer Vorgang ausgeführt. Das Betriebssystem erwartet kurze Zeit für die Ausführung des Dienstes. Führen Sie Ihre Methode mithilfe des Thread-Starts aus:

protected override void OnStart(string[] args)
{
    Thread t = new Thead(new ThreadStart(MethodName)); // e.g.
    t.Start();
}
5
Eranna

Ich schieße hier blind, aber ich habe oft festgestellt, dass lange Verzögerungen beim Start von Diensten direkt oder indirekt durch Netzwerkfunktions-Timeouts verursacht werden, häufig, wenn versucht wird, einen Domänencontroller zu kontaktieren, wenn Konto-SIDs gesucht werden. Dies geschieht häufig indirekt über GetMachineAccountSid(), ob Sie es erkennen oder nicht, da diese Funktion vom RPC-Subsystem aufgerufen wird.

Ein Beispiel zum Debuggen in solchen Situationen finden Sie unter Der Fall der Verzögerungen beim Start des Prozesses in Mark Russinovichs Blog.

5

Wenn Sie in Ihrem Dienst wie unten beschrieben Debug-Code verwenden, kann das Problem auftreten.

#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new EmailService()
};
ServiceBase.Run(ServicesToRun);
#else
//direct call function what you need to run
#endif

Um dies zu beheben, entfernen Sie die # if-Bedingung, während Sie Ihren Windows-Dienst erstellen, da dies nicht funktioniert hat.

Bitte verwenden Sie stattdessen das Argument für den Debug-Modus.

if (args != null && args.Length > 0)
{
_isDebug = args[0].ToLower().Contains("debug");
}
4
Bulu

Ich hatte ein ähnliches Problem mit einem Dienst, den ich schrieb. Es hat gut funktioniert, dann bekam ich eines Tages das Timeout für Startfehler. Es geschah in einem bzw. beiden Release und Debug, je nachdem, was los war. Ich hatte einen EventLogger von System.Diagnostics instanziiert, aber der Fehler, den ich sah, muss geschehen sein, bevor der Logger schreiben konnte ... 

Wenn Sie nicht wissen, wo die EventLogs nachgeschlagen werden sollen, können Sie in VS unter dem Server-Explorer zu Ihrem Computer wechseln. Ich fing an, in ein paar anderen EventLogs zu stöbern, abgesehen von denen für meinen Service. Unter Application - .NETRuntime habe ich die Fehlerprotokolle gefunden, die für den Fehler beim Start relevant sind. Grundsätzlich gab es im Konstruktor meines Services einige Ausnahmen (eine stellte sich als Ausnahme beim EventLog-Instanz-Setup heraus - was erklärt, warum ich in meinem Service EventLog keine Protokolle sehen konnte). Bei einem vorherigen Build gab es anscheinend andere Fehler (die mich veranlasst hatten, die Änderungen vorzunehmen, die zu dem Fehler im EventLog-Setup führten).

Um es kurz zu machen: Der Grund für das Timeout kann verschiedene Ausnahmen/Fehler sein, aber die Verwendung der Runtime EventLogs kann Ihnen nur helfen, herauszufinden, was los ist (insbesondere in den Fällen, in denen ein Build funktioniert, ein anderer jedoch nicht).

Hoffe das hilft!

3
Alexis La Joie

In meinem Fall fehlte die Version von .net framework.

Mein Service benutzt 

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

Die .net Framework-Version des Servers war jedoch 4, sodass das Problem durch Ändern von 4.5 auf 4 behoben wurde:

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
3
Masoud

Kopieren Sie die Version DLL oder laden Sie die DLL aus dem Freigabemodus anstelle des Debug-Modus und fügen Sie sie in den Installationsordner ein. Das sollte funktionieren

2
peter

Ich hatte dieses Problem und es hat mich für zwei Tage verrückt gemacht ... Wenn dein Problem ähnlich zu meinem ist:

Ich habe in meinem Windows-Dienst Einstellungen "Benutzereinstellungen", so dass der Dienst eine Selbstwartung durchführen kann, ohne den Dienst zu stoppen und zu starten. Nun, das Problem liegt bei den „Benutzereinstellungen“, bei denen die Konfigurationsdatei für diese Einstellungen in einem Ordner unter dem Benutzerprofil des Benutzers gespeichert wird, der den Windows-Dienst unter der Service-Exe-Dateiversion ausführt. 

Dieser Ordner wurde aus irgendeinem Grund beschädigt. Ich habe den Ordner gelöscht und der Dienst funktioniert wieder wie gewohnt…

2
Bader Mahayni

Dieses Problem tritt normalerweise auf, wenn eine Referenz in Ihrer Assembly fehlt und die Bindung zur Laufzeit normalerweise fehlschlägt.

debuggen Sie Thread.Sleep(1000) in der main(). und setzen Sie einen Haltepunkt in die nächste Zeile der Ausführung.

Starten Sie dann den Prozess und hängen Sie den Debugger während des Startvorgangs an den Prozess an. Drücken Sie die Taste f5, nachdem der Haltepunkt erreicht wurde. Es wird die Ausnahme der fehlenden Assembly oder Referenz ausgelöst. 

Hoffentlich wird dieser Fehler behoben. 

2
savvyBrar

Versuchen Sie einmal, Ihre Exe-Datei auszuführen. Ich hatte das gleiche Problem, aber als ich es direkt per Doppelklick auf die Exe-Datei ausgeführt habe, erhielt ich eine Meldung über die .Net Framework-Version, da mir das Serviceprojekt mit einem Framework veröffentlicht wurde, das nicht auf dem Zielcomputer installiert war. 

2
Tomcat0x4d2e47

Ich hatte dieses Problem, es dauerte ungefähr einen Tag, um es zu beheben. Für mich war das Problem, dass mein Code den "Hauptinhalt" übersprang und effektiv ein paar Zeilen ablieferte und dann fertig war. Und das hat mir den Fehler verursacht. Es handelt sich um eine C # -Konsolenanwendung, die einen Windows-Dienst installiert. Sobald sie versucht, ihn mit dem ServiceController (sc.Run ()) auszuführen, wird dieser Fehler für mich ausgegeben.

Nachdem ich den Code repariert hatte, um zum Hauptinhalt zu gelangen, wurde der beabsichtigte Code ausgeführt:

ServiceBase.Run(new ServiceHost());

Dann tauchte es nicht mehr auf.

Wie viele Leute bereits gesagt haben, kann der Fehler alles Mögliche sein, und die von ihnen angebotenen Lösungen können ihn möglicherweise lösen oder nicht. Wenn sie das Problem nicht lösen (wie das Release anstelle von Debug, das Hinzufügen von generatePublisherEvidence = false in Ihrer Konfiguration usw.), liegt das Problem wahrscheinlich an Ihrem eigenen Code.

Versuchen Sie, Ihren Code auszuführen, ohne sc.Run () zu verwenden (d. H. Den Code ausführen zu lassen, den sc.Run () ausgeführt hätte).

2
goamn

Installieren Sie das Debug-Build des Diensts und hängen Sie den Debugger an den Dienst an, um zu sehen, was passiert.

2
Sijin

Ich möchte die Kommentare von mdb hier wiederholen. Geh diesen Weg nicht. Ihr Service sollte keine Benutzeroberfläche haben ... "Keine Benutzerinteraktion" ist wie die definierende Funktion eines Services.

Wenn Sie Ihren Dienst konfigurieren müssen, schreiben Sie eine andere Anwendung, die dieselbe Konfiguration bearbeitet, die der Dienst beim Start liest. Machen Sie es zu einem eindeutigen Werkzeug - wenn Sie den Dienst starten möchten, starten Sie den Dienst. Wenn Sie es konfigurieren möchten, führen Sie das Konfigurationstool aus.

Wenn Sie eine Echtzeitüberwachung des Dienstes benötigen, ist dies etwas schwieriger (und sicherlich etwas, das ich mir bei den Diensten gewünscht habe). Jetzt sprechen Sie darüber, dass Sie interprozessorische Kommunikation und andere Kopfschmerzen verwenden müssen.

Das Schlimmste ist, wenn Sie eine Benutzerinteraktion benötigen, dann haben Sie hier eine echte Trennung, da Dienste nicht mit dem Benutzer interagieren.

In deinen Schuhen würde ich zurücktreten und fragen warum muss das ein Dienst sein ? Und warum braucht es Benutzerinteraktion ?

Diese beiden Anforderungen sind ziemlich inkompatibel und sollten Alarm auslösen.

2
rice

 enter image description here

Hat Stunden gedauert, hätte die Ereignisanzeige get_AppSettings () gesehen.

Eine Änderung in der App-Konfiguration hat das Problem verursacht.

1
AJ AJ

Mein Problem war aufgrund des in Windows-Dienstkonfiguration genannten Zielframeworks 

<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
 </startup>

und mein Server, auf dem ich Windows-Dienst installieren wollte, wurde für diese .NET-Version nicht unterstützt.

Wenn ich das ändern würde, könnte ich das Problem lösen.

1
NidhinSPradeep

Ich hatte auch ein ähnliches Problem und stellte fest, dass ein Problem beim Laden der Baugruppe bestand. Ich habe diese Fehlermeldung sofort erhalten, als ich versuchte, den Dienst zu starten.

Um das Problem schnell zu beheben, versuchen Sie, den ausführbaren Dienst über den Befehl Prompt mit ProcDump http://technet.Microsoft.com/en-us/sysinternals/dd996900 auszuführen. Sie muss einen ausreichenden Hinweis auf den genauen Fehler geben.

http://bytes.com/topic/net/answers/637227-1053-error-trying-start-my-net-windows-service hat mir ziemlich geholfen.

0
Mitul Makadia

In meinem Fall war dies die Erlaubnis für user account in AD . Nachdem Sie es richtig eingestellt haben, funktioniert es einwandfrei.

0
Leandro Gadelha

Der Release-Build funktionierte nicht für mich. Ich habe jedoch meine Ereignisanzeige und mein Anwendungsprotokoll durchgesehen und festgestellt, dass der Windows-Dienst beim Erstellen eines Ereignisprotokolls eine Sicherheitsausnahme auslöst. Dies wurde behoben, indem die Ereignisquelle manuell mit Administratorzugriff hinzugefügt wurde.

Ich habe diese Anleitung von Microsoft befolgt:

  • Öffnen Sie den Registrierungseditor, führen Sie -> regedit aus
  • Suchen Sie den folgenden Registrierungsunterschlüssel: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
  • Klicken Sie mit der rechten Maustaste auf den Anwendungsunterschlüssel, zeigen Sie auf Neu, und klicken Sie dann auf Schlüssel.
  • Geben Sie den Namen der Ereignisquelle ein, die in Ihrem Windows-Dienst für den Schlüsselnamen verwendet wird.
  • Schließen Sie den Registrierungseditor.
0
Peroxy

Das Hinzufügen von 127.0.0.1 crl.Microsoft.com zur Datei "Hosts" hat unser Problem behoben.

0
Regie

Sowohl das lokale Systemkonto als auch der lokale Dienst würden für mich nicht funktionieren. Ich habe es dann auf Netzwerkdienst gesetzt und das hat gut funktioniert.

0
Rory Beling

Öffnen Sie das Dienste-Fenster als Administrator. Versuchen Sie dann, den Dienst zu starten. Das hat für mich funktioniert. 

Wenn Sie über ein Windows-Formular verfügen, das zum Testen verwendet wird, stellen Sie sicher, dass das Startobjekt immer noch der Dienst und nicht das Windows-Formular ist

0
Peter PitLock

Ich hatte dieses ähnliche Problem, Stopps, denen ich folgte

  1. Fügen Sie ein Debugger.Launch () in den Windows-Dienstkonstruktor ein
  2. Schritt für Schritt verfolgt, um zu sehen, wo es steckt

Mein Problem war nicht auf einen Fehler zurückzuführen. Ich hatte eine BlockingCollection.GetConsumingEnumerable () im Weg. Dadurch musste der Windows-Dienst warten.

0
Akbar Badhusha

In meinem Fall hatte ich dieses Problem aufgrund eines echten Fehlers. Vor dem Aufruf des Servicekonstruktors schlug ein statischer Konstruktor der Membervariablen fehl:

    private static OracleCommand cmd;

    static SchedTasks()
    {
        try
        {
            cmd = new OracleCommand("select * from change_notification");
        }
        catch (Exception e)
        {
            Log(e.Message); 
            // "The provider is not compatible with the version of Oracle client"
        }
    }

Durch das Hinzufügen eines Try-Catch-Blocks stellte ich fest, dass die Ausnahme aufgrund einer falschen Oracle-Version auftrat. Durch das Installieren der richtigen Datenbank wurde das Problem behoben.

0
bob

Das hat bei mir funktioniert. Vergewissern Sie sich grundsätzlich, dass der Benutzer "Anmelden" auf den richtigen Benutzer eingestellt ist. Es hängt jedoch davon ab, wie die Kontoinfrastruktur eingerichtet wird. In meinem Beispiel werden AD-Konto-Anmeldeinformationen verwendet. 

Suchen Sie im Startmenü nach "Services" -In Services finden Sie den erforderlichen Service Klicken Sie mit der rechten Maustaste auf und wählen Sie die Registerkarte Anmelden aus -Wählen Sie "Dieses Konto" und geben Sie den erforderlichen Inhalt bzw. die erforderlichen Anmeldeinformationen ein -Ok und starten Sie den Dienst wie gewohnt

 enter image description here

0
d689p

Wir haben Log4Net für die Protokollierung in einer Datenbanktabelle konfiguriert. Die Tabelle war so groß geworden, dass der Dienst beim Versuch, Nachrichten zu protokollieren, abgelaufen war.

0
leem

Ich hatte auch dieses Problem. Ich habe es zur Arbeit gebracht, indem ich Logon account in Local System Account geändert habe. In meinem Projekt hatte ich es als lokales Dienstkonto eingerichtet. Bei der Installation wurde standardmäßig der lokale Dienst verwendet. Ich verwende .net 2.0 und VS 2005. Die Installation von .net 1.1 SP1 hätte also nicht geholfen. 

0
anonymous
  1. Projekt im Freigabemodus erstellen.
  2. Kopieren Sie alle Dateien des Release-Ordners in den Quellpfad.
  3. Führen Sie den Windows-Dienst mit dem Befehl Eingabeaufforderungsfenster im Administratorzugriff aus.
  4. Löschen Sie niemals Dateien aus dem Quellpfad.

Zumindest funktioniert das bei mir.

0
user3044767