Datenbank-Verbindung funktioniert nicht, wenn Dienst beim Booten startet, aber funktioniert, wenn es von Hand ist gestartet

StackOverflow https://stackoverflow.com/questions/687489

Frage

Ich versuchen, mögliche Ursachen für meine Anwendung auf der Spur nicht zu einem DB-Server verbinden zu können.

Ich habe einen Windows-Dienst, der mit der Datenbank verbindet, wenn es beginnt. Der Dienst läuft auf Rechner mit einer zuverlässigen verkabelte Netzwerkverbindung. Es ist mit Start-Automatik eingebaut, so normalerweise beginnt es, wenn die Fenster der Fall ist, und in fast allen Fällen das funktioniert gut.

Doch mit einem Satz von XP-Rechnern der Datenbank-Verbindung fehlschlägt (die ich nicht der Kontrolle über haben kann), wenn der Dienst startet mit Windows starten. Die Standard-Ausnahme ausgelöst:

  

System.Data.SqlClient.SqlException: Ein   Fehler beim Aufbau   eine Verbindung zum Server her. Wann   eine Verbindung zu SQL Server 2005, das   Fehler können durch die Tatsache verursacht werden, dass   unter den Standardeinstellungen von SQL Server   nicht zulässt, Remote-Verbindungen.   (Anbieter: SQL Network Interfaces,   Fehler: 26 - Fehler Lokalisierung   Server / Instanz angegeben)

Auf diesen Maschinen, wenn ein Benutzer angemeldet ist und startet den Dienst manuell in die Datenbank verbindet richtig, was ziemlich komisch ist. Also ich denke, das Problem beim Start von Windows ist entweder:

  • Der Dienst beginnt, bevor das Netzwerk verbunden ist
  • Der Dienst startet, bevor die Maschine, um DNS-Verbindung herstellen kann die Servernamen zu lösen (wenn das ist, wie DB-Servernamen aufgelöst werden)
  • Es ist eine Politik / Firewall / etc auf der Maschine, die ursprünglich ausgehende Verbindungen verhindert
  • etwas anderes ...

Das Problem tritt nicht auf, wenn ein Benutzer den Dienst manuell gestartet wird, so haben muss etwas passiert ist, das Problem zu lösen. Ich denke, das ist entweder ein Prozess, der beim Start läuft aber noch nicht beendet, wenn mein Dienst gestartet wird, oder die Tatsache, dass ein Benutzer angemeldet hat -. Möglicherweise etwas in ihrem Anmeldeskript

Ich habe keinen direkten Zugang zu den Maschinen, so muß mit einer guten Vorstellung davon, was das Problem sein kommen könnte und eine Möglichkeit zu erkennen, ob das richtig ist. Ich kann nicht wiederholt einsetzen Diagnoseprogramme so müssen das erste Mal gründlich sein.

So erste Frage lautet: Wer weiß, von Desktop-Richtlinien, Netzwerkrichtlinien oder Software, die diese Situation verursachen könnte? Zweite Frage: Was kann ich tun, genau zu diagnostizieren, was geschieht

Ich denke, einen neuen Diagnose-Service zu schaffen, die auch automatisch gestartet werden installiert und wird verschiedene Aktionen durchführen, um zu sehen, was los ist, und diese Informationen anmelden. zB:

  • run "ipconfig / all" (um zu sehen, ob es eine Netzwerkverbindung)
  • ping der Datenbankserver durch die IP-Adresse (um zu sehen, ob es den Server finden)
  • ping der Datenbankserver mit Namen
  • überprüfen Sie die HKLM Registrierungsschlüssel, der den Servernamen enthält (die HKLM-Registrierung für den Fall später aktualisiert)
  • erstellen SQL-Verbindung zur Datenbank (um herauszufinden, wann diese Arbeit beginnt)
  • Wiederholen Sie diese Schritte alle paar Sekunden.

Ich werde diesen Dienst installiert haben, die Maschine neu starten, dann nach einer Periode in eine Benutzeranmeldung haben. Die Diagnose einige nützliche Informationen zeigen sollte ... aber jemand eine bessere Idee oder zusätzliche Anregungen?

Ich habe auch versucht, den Dienst zu ändern als Benutzerkonto mit geeignet Rechten ausgeführt, aber das hat das Problem nicht lösen. Beachten Sie, dass das lokale Systemkonto ausreichend Privilegien muss den DB-Server zu verbinden, da der Service einwandfrei funktioniert, wenn sie manuell gestartet. so ist es nicht das gleiche wie diese Frage .

UPDATE:. Lästige Maschinen laufen Win XP

UPDATE: dieser Artikel eine gute Diskussion von Fehlercode 26

War es hilfreich?

Lösung

Wir haben vor gerade dieses Problem aufgetreten. Die Art, wie wir das Problem gelöst war einen Start Thread zu haben, die nicht beendet haben, bis eine Verbindung zur Datenbank hergestellt werden kann. Wir würden die Verbindung versuchen, jeder so oft und melden Sie sich die Tatsache, dass wir keine Verbindung herstellen konnte. Sobald wir die Verbindung hergestellt würden wir den Dienst weiter.

Mit anderen Worten, lassen Sie Ihren Dienst startet normalerweise, aber lassen Sie es nicht jede Arbeit verrichten attmept, bis er weiß, ob es mit der Datenbank verbinden kann. Seien Sie vorsichtig, wenn Sie sich entscheiden, jede Verbindung Fehler zu protokollieren, wie Sie eine Maschine mit nutzlosen Log-Einträge füllen könnte. Wir würden den ersten Verbindungsfehler protokollieren und nicht wieder, wenn der Dienst neu gestartet wurde.

Natürlich, wenn Sie Datenbank immer lokal zu Ihren Diensten, die bessere Lösung ist es, eine Abhängigkeit zu dem Datenbank Windows-Dienst zu erstellen, aber es klingt nicht wie die Datenbank lokal ist.

Andere Tipps

Ist es möglich, dass diese Maschinen eine Art von Firewall auf ihnen installiert haben, die noch von der Zeit, Ihr Dienst startet nicht hochgedreht hat? Ich habe in einige Fälle laufen, wo ein Software-Firewall vollständig Internet-Konnektivität sperren, bis der Dienst vollständig gestartet wird, und es kann den Verkehr richtig überwachen - wenn dies der Fall ist, und Ihr Service startet schneller als der Firewall, man konnte sehen, was Ihre Anwendung erscheint ein getrenntes Netzwerk zu sein.

Mehrere Hinweise:

  1. Vielleicht sollten Sie setzen ein Abhängigkeit aus dem Dienst zu einem anderen Windows-Dienst (wie SQL Server oder DTC), die dafür sorgen wird, dass diese Dienste, bevor Sie Ihr Dienst gestartet gestartet werden.

  2. Eine weitere Option (abhängig von dem O Sie laufen) ist Verzögerung Autostart-Dienste , werfen Sie einen Blick auf http://msdn.microsoft.com/en-us/magazine/cc164252.aspx

  3. Dritter Option:. Einfach etwas Thread.Sleep setzen (oder Abfrageschleife), um Ihren Service-Thread, bevor es an die DB zum ersten Mal verbindet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top