2010-02-11 2 views
11

Ich habe einen Windows-Dienst in C# programmiert, der eine Verbindung zu einer SQL-Server 2005 Express Datenbank mit System.Data.SqlClient herstellen sollte.Wie verbinde ich mich mit sql-Server mit Windows-Authentifizierung von Windows-Service?

Da Microsoft Windows-Authentifizierung über SQL-Authentifizierung bevorzugt, habe ich versucht, eine Verbindung zur Datenbank mit Trusted Conenction/Integrated Security herzustellen.

Allerdings funktioniert das nicht, da ich eine System.Data.SqlClient.SqlException: Anmeldung fehlgeschlagen für Benutzer 'NT AUTHORITY \ LOCAL SERVICE'.

Kann ich mich mit einem anderen Windows-Konto anmelden?

Antwort

13

Momentan scheint der Dienst derzeit unter der LocalService Account ausgeführt zu werden und dieses Dienstkonto ist derzeit nicht für SQL autorisiert.

Die Situation kann auf zwei Arten behoben werden: Ausführen des Kontos unter einem Konto, das in SQL autorisiert ist, oder Hinzufügen des LocalService-Kontos als Anmeldung in SQL. Speziell:

  • Ändern Sie, in welchem ​​Konto der Dienst ausgeführt wird, in der Service Management Console. (Beispiel: Computerverwaltung | Dienste und Anwendungen | Dienste klicken Sie dann mit der rechten Maustaste auf "Eigenschaften" für den betreffenden Dienst)
  • Alternativ können Sie in "Microsoft SQL Management Studio" das LSA-Konto als Anmeldung hinzufügen und diesen neuen Prinzipal festlegen (Login) so, dass auf die gewünschten Datenbankobjekte zugegriffen werden kann.

bearbeiten: Der erste Ansatz wahrscheinlich vorzuziehen ist, weil das Konto Local so pervasively im System gefunden, dass es den Zugriff auf SQL Gewährung SQL aussetzen würde und die Datenbanken würde ein bestimmter Dienst oder Treiber verwenden sie kompromittiert werden .
Durch die Einführung eines bestimmten Accounts hat man mehr Kontrolle darüber, wer auf SQL-Objekte zugreift und wie. Dies bringt natürlich das Problem der Konfiguration eines solchen Kontos mit Bezug auf die Privilegien mit sich, die auf der Ebene des Systems (nicht von SQL) gewährt werden müssen, und abhängig davon, was der zugrundeliegende Dienst tut, muss dieses Konto eventuell eingerichtet werden ziemlich mächtig, daher eine mögliche Haftung auf andere Weise ....

+0

danke. Ändern des Benutzers für den Dienst klingt gut. aber wie kann das programmatisch gemacht werden? Ich möchte das in meinem C# -Programm tun - nicht in der Service-Management-Konsole. –

+0

@ raph: Vor einiger Zeit hätte ich vorgeschlagen, in die ADSI-API zu schauen, aber jetzt sollten Sie in der Lage sein, mit Accounts einfacher zu verfahren die .NET System.ServiceProcess.ServiceController-Klasse. Obwohl ich dies zum Starten/Stoppen von Diensten verwende, habe ich die Einstellung eines Dienstes auf diese Weise nie geändert. Andere Ansätze, die ich gesehen habe, erzeugen einen net-Befehl (obwohl ich glaube nicht, dass der Dienst so geändert werden kann) und neuerdings mit PowerShell (erlaubt das Ändern von Diensteigenschaften, obwohl ich auch keine Erfahrung damit habe .. .). – mjv

+1

LSA steht für * Local Security Authorithy *, nicht LocalService. http://msdn.microsoft.com/en-us/library/ms721592%28VS.85%29.aspx#_security_local_security_authority_gly#_security_local_security_authority_gly –

1

Sie müssen Zugriff auf das Konto LOCAL SERVICE in SQL Express gewähren. Laut meinem Kommentar wäre mein Ratschlag, ein neues Konto zu erstellen, unter dem Ihr Dienst ausgeführt werden kann, und dann die entsprechenden Berechtigungen in SQL Express hinzuzufügen, dh, führen Sie Ihren Dienst nicht unter LOCAL SERVICE aus.

+1

Ich dachte darüber nach, aber würde dann nicht jeder Dienst Zugriff auf meine db bekommen? –

+0

Jeder Dienst, der unter diesem Konto ausgeführt wird, ja. Sie sollten ein separates Konto erstellen und nur die erforderlichen Berechtigungen angeben. – James

2

Wenn Sie die vertrauenswürdige Windows-Authentifizierung verwenden möchten, ist es am einfachsten, den Dienst mit einem Domänenkonto (mit den wenigsten erforderlichen Berechtigungen) auszuführen, das für die SQL Server-Datenbank zugelassen ist.

3

Wenn ein Windows-Dienst vom Dienststeuerungs-Manager gestartet wird, wird der Prozess als ein bestimmter Benutzer ausgeführt, genau wie bei jedem anderen Prozess, der auf dem Betriebssystem ausgeführt wird.

Es gibt eine Reihe von "integrierten" Benutzerkonten, die zum Ausführen von Windows-Diensten verwendet werden. Sie können den vollständigen Satz der Windows-Dienste und das Konto, unter dem sie ausgeführt werden (in Windows 7 "Anmelden als" genannt) sehen, wenn Sie sich den Knoten "Dienste" in der Computerverwaltung ansehen.

Aus meiner Erfahrung, wenn wir ein Windows-Dienst sollen die DB mit integrierten Sicherheit, die wir unter den zweiten Ansatz sprechen:

1) Vergeben Sie einen der integrierten Konten als „Anmelden als“ Konto und fügen Sie dieses Konto als Anmeldung auf der SQL Server-Instanz mit den entsprechenden DB-Berechtigungen

2) Verwenden Sie/erstellen Sie eine lokale oder Domänenkonto für den Windows-Dienst zu verwenden und dann dieses Konto als Login mit der entsprechenden DB hinzufügen Berechtigungen. Es ist möglich, dass das Installationsprogramm während der Installation des Dienstes nach den Anmeldeinformationen des Benutzerkontos fragt.

Ich kann nicht behaupten, Experte genug, um alle Profis darauf hin-und Nachteile der einzelnen Ansätze, jedoch lohnt es sich, unter Berücksichtigung der folgenden:

  • mit Ansatz 1 alle Dienste und Prozesse, wie die ausgewählte laufen Das integrierte Konto verfügt über die Berechtigung, auf Ihre Datenbank zuzugreifen. Dies ist bei Approach 2 nicht der Fall.

  • Bei Approach 1 wird die Passwortkonfiguration von der Maschine selbst verwaltet, aber bei Approach 2 kann das Passwort von den Administratoren verwaltet werden und den erforderlichen Sicherheitsrichtlinien entsprechen.

Ich hoffe, das hilft

1

Wie mjv sagte, müssen Sie entweder lokalen Dienstkonto Zugriff auf die Datenbank geben oder ein anderes Konto verwenden, um den Dienst auszuführen. Sie haben gefragt, wie Sie das Konto programmatisch ändern können, indem Sie ein Installationsprogramm für den Dienst erstellen und die Kontoeigenschaft in "Benutzer" ändern und dann den Benutzernamen und das Kennwort angeben, um den Dienst auszuführen.

Der folgende Link enthält Informationen zum Erstellen Sie das Installationsprogramm, wenn Sie nach unten scrollen:

http://msdn.microsoft.com/en-us/library/aa984464(VS.71).aspx

Während wir im Folgenden etwas ausführlicher über die Immobilie Konto lautet:

http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceprocessinstaller.account(VS.71).aspx

Hoffe, das hilft.

Verwandte Themen