Laden...

Anmeldungsfehler zum SQL Server beim Starten des Projektes

Erstellt von AdmiralKuzan vor einem Jahr Letzter Beitrag vor einem Jahr 3.706 Views
A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr
Anmeldungsfehler zum SQL Server beim Starten des Projektes

Verwendetes Datenbanksystem: <MSQL Server>

Hallo, zuerst einmal etwas über mein Projekt: Ich habe einen MSQL Server innerhalb einer Linux Ubuntu Server VM auf einem Windows Host. Dort habe ich eine Datenbank mit einer Tabelle angelegt, sowie einen Benutzer ("Charpuser") mit der Rolle db_datareader. Nun möchte ich für Visualisierungszwecke eine kleine .net Anwendung schreiben, welche sich bei der Datenbank anmeldet und die Daten tabellarisch und graphisch anzeigen kann.

Hier mein Problem: Ich kann mich bei der Datenbank anmelden und verschiedene Table Adapter mit Abfragen generieren, welche auch funktionieren und ich sehe die entsprechenden Daten in der Ansicht im Abfragen Generator vom Table Adapter. D.h. für mich, mein angelegter Nutzer besitzt auf jeden Fall das Recht dazu Daten zu lesen, denn es funktioniert ja innerhalb dieser Ansicht.

Wenn ich nun aber so eine Abfrage erstellt habe, und diese dann per Drag und Drop auf ein Windows Form Objekt ziehen möchte und das Projekt dann Starten möchte, gibt es ein Fehler an folgender Stelle meiner Form1 Klasse (automatisch generierter Code). (s. Anhang für ausführliche Fehlermeldung)

Fehler Code 18456 mit State 1. Laut der Microsoft Dokumentation bedeutet das: "Es sind keine Fehlerinformationen verfügbar. Dieser Status bedeutet normalerweise, dass Sie keine Berechtigung haben, die Fehlerdetails zu empfangen. Weitere Informationen erhalten Sie beim SQL Server-Administrator" (MSSQLSERVER_18456 - SQL Server)

Das ganze bringt mich leider nicht weiter.. Es scheint ein Berechtigungsproblem zu geben. Aber wieso gibt es das erst, wenn ich das Programm starte und einen Abfragewert in meiner .net Anwendung nutzen möchte, nicht aber innerhalb des Abfragengenerators im Table-Adapter? Darauf kann ich mir keinen Reim machen, ich hoffe jemand kann mir helfen.

(Habe das ganze auch schon mit dem sa Benutzer versucht, Anmeldung ging, Abfragen Erstellung im Table Adapter ebenfalls, aber auch hier gabs den gleichen Fehler beim Starten des Projekts.)

Liebe Grüße

4.939 Beiträge seit 2008
vor einem Jahr

Hallo und willkommen,

wie sieht denn der genaue ConnectionString aus (d.h. User/Passwort oder über Windows-Anmeldung)?

16.835 Beiträge seit 2008
vor einem Jahr

Der SQL Server hat mehrere Connection Arten und i.d.R verwendet Dein Tool einen anderen Mechanismus als der Provider in .NET / Java / NodeJS. Das kann man also nicht vergleichen.
In den meisten Fällen wird genau dieser Fehler aber ausgelöst, weil Du was bei den Credentials / Server-Connection Parametern falsch gemacht hast; zeig die bitte mal.

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Als Authentifizierungsmethode nutze ich SQL Server-Authentifizierung, also mit Username + Passwort.

Connection String aus den Eigenschaften der Datenverbindung: Data Source=142.58.42.148;Initial Catalog=Bachelor;Persist Security Info=True;User ID=Charpuser

(geänderte IP)

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Der SQL Server hat mehrere Connection Arten und i.d.R verwendet Dein Tool einen anderen Mechanismus als der Provider in .NET / Java / NodeJS. Das kann man also nicht vergleichen.
In den meisten Fällen wird genau dieser Fehler aber ausgelöst, weil Du was bei den Credentials / Server-Connection Parametern falsch gemacht hast; zeig die bitte mal.

Meinst du die Einstellungen im Anhang?

16.835 Beiträge seit 2008
vor einem Jahr

Wenn Du Teile eines Connection Strings nicht zeigen willst, was richtig ist, dann verwende bitte Platzhalter und verfälsch nicht den String selbst.
Wir wissen zB nicht, warum Du jetzt kein Passwort im String hast: vergessen oder das ganze Ding entfernt?

Als Authentifizierungsmethode

Ein SQL Server versteht verschiedene Arten angesprochen zu werden, zB TCP/IP, Named Pipes....
Siehe dazu Creating a Valid Connection String Using TCP IP - SQL Server
Creating a Valid Connection String Using Shared Memory Protocol - SQL Server
Creating a Valid Connection String Using Named Pipes

Der Standard Connection String ist


Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;

Bei IP ist es


Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;

Wobei DBMSSOCN aussagt, dass TCP/IP verwendet wird und nicht der Standard über Named Pipes.
SQL Server connection strings - ConnectionStrings.com

Named Pipes ist nämlich eine Inter Process Kommunikation, die nur auf der selben Maschine funktioniert.
Wenn Du also Dein Tool (vermutlich SQL Management Studio) auf der gleichen Maschine verwendest auf dem der SQL Server läuft: dann geht das.
Aber Du kannst kein Named Pipes von einer anderen Maschine aus verwenden.

Du verwendets im Tool offenbar Named Pipes - und auch Dein Connection String ist, so wie ich das verstehe, Named Pipes.

PS:
IIRC, die Angabe von DBMSSOCN macht das gleiche wie das


Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;

tcp: Prefix vor der IP


Data Source=tcp:190.190.200.100,1433;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;

Ich seh zumindest nun anhand der Angaben von Dir keinen anderen potentiellen Fehler.
Kann natürlich auch an was anderem liegen (an den generellen Auth Einstellungen des SQL Servers zum Beispiel).

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Heißt der User wirklich "Charpuser" und nicht "CSharpuser"?

Ja, hab den so genannt

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Wenn Du Teile eines Connection Strings nicht zeigen willst, was richtig ist, dann verwende bitte Platzhalter und verfälsch nicht den String selbst.
Wir wissen zB nicht, warum Du jetzt kein Passwort im String hast: vergessen oder das ganze Ding entfernt?

Das Passwort steht nicht in meinem Connection String. Ich habe beim erstellen der Datenanbindung irgend ein Haken gesetzt, dass das Passwort besonders geschützt und nicht über diesen String übertragen werden soll, ich wusste nicht was das für Auswirkungen haben könnte und hielt es daher für eine sinnvolle Option. Wie genau die Option hieß, weiß ich leider nicht mehr. Eventuell ist das schon ein Problem gewesen nehme ich an?

Wenn Du also Dein Tool (vermutlich SQL Management Studio) auf der gleichen Maschine verwendest auf dem der SQL Server läuft: dann geht das.
Aber Du kannst kein Named Pipes von einer anderen Maschine aus verwenden.

Mein Server läuft innerhalb von Ubuntu Server innerhalb einer virtuellen Maschine in Virtual Box (beschrieben bei Threadstart). VM läuft innerhalb des Windows PCs auf dem ich die C# Anwendung schreibe.

Du verwendets im Tool offenbar Named Pipes - und auch Dein Connection String ist, so wie ich das verstehe, Named Pipes.

Mir ist nicht bewusst dass ich das bewusst eingestellt habe, wie ändere ich das ganze weg von Named Pipes zu z.b. TCP/IP? Kann ich einfach den Connection String manuell verändern?

4.939 Beiträge seit 2008
vor einem Jahr

Hast du denn mal in den Logdaten des MSSQL-Servers geschaut, was da ankommt?

16.835 Beiträge seit 2008
vor einem Jahr

Naja, natürlich musst Du ein Passwort im Connection string mitgeben, sonst kannst Dich logischerweise nicht anmelden - außer Du verwendest Windows Authentication (Integrated Security) oder Azure Active Directory (Managed Identity), wo man aber auch kein Username hat (und in Deinem Fall auch nicht geht).

Ich habe beim erstellen der Datenanbindung irgend ein Haken gesetzt, dass das Passwort besonders geschützt und nicht über diesen String übertragen werden soll

Diesen Haken hat natürlich nur Dein Tool und nicht Deine Anwendung.
Was Du meinst ist vermutlich Persist Security Info.
Aber auch da kannst Du nicht einfach das Passwort weglassen.

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Hast du denn mal in den Logdaten des MSSQL-Servers geschaut, was da ankommt?

Hab den Errorlog gerade offen und da steht:
"Login failed for user 'Charpuser'. Ursache: Das Kennwort hat nicht mit dem für die Anmeldung angegebenen Kennwort übereingestimmt. [CLIENT: IP von meinem Windows PC].

Es scheint also wirklich an dem Passwort zu liegen, aber wie bekomme ich das denn jetzt in den Connection String? Es gibt ja ein Passwort und ich geb das ja auch ein um die Verbindung erstmalig herzustellen und es wird ja auch in der erweiterten Ansicht der Verbindungseinstellungen mit ********** angezeigt. Nur im Connection String taucht es nicht auf..

16.835 Beiträge seit 2008
vor einem Jahr

Nur im Connection String taucht es nicht auf..

Das Tool zeigt Dir das Passwort natürlich aus Sicherheitsgründen nicht an.

Es scheint also wirklich an dem Passwort zu liegen, aber wie bekomme ich das denn jetzt in den Connection String?

Hab Dir oben a) schon gezeigt wie der String mit Passwort aussehen sollte und b) einen Link gegeben, wo man alle Arten der SQL Connection Strings nachlesen kann, falls bisher gezeigte nicht für Deinen Fall passt.

4.939 Beiträge seit 2008
vor einem Jahr

Was kannst du denn in den Einstellungen für den .NET SqlClient Data Provider bei "Sicherheit" / "Authentication" auswählen?

@Abt: Der Connectionstring wird ja anhand dieser Einstellungen der Datenverbindungs-Komponente erstellt.

16.835 Beiträge seit 2008
vor einem Jahr

Für mich hört sich das so an, dass AdmiralKuzan einfach Dinge miteinander vermischt.
Ist ja schön und gut, wenn in der Tool-Ansicht nen Connection String mit Passwort steht; hilft aber nicht, wenn er programmatisch darauf zugreifen will und kein Passwort im Connection String steht.

Das Passwort steht nicht in meinem Connection String.

Sind zwei Paar Stiefel.

Oder versteh ich sein Setup falsch?

4.939 Beiträge seit 2008
vor einem Jahr

Nein, es handelt sich hierbei um (WinForms-) Komponenten: Data Components in Visual Studio .NET: Part I

Using these components is similar to using any windows control. You just drag the component to a form, set its properties and methods and you're up and running.

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Was kannst du denn in den Einstellungen für den .NET SqlClient Data Provider bei "Sicherheit" / "Authentication" auswählen?

Kann da auswählen: NotSpecified (war bei mir der Fall), SqlPasswort, ActiveDirectoryPassword, ActiveDirectoryIntegrated und ActiveDirectiveInteractive . Wenn ich NotSpecified nehme und dann auf Testverbindung gehe steht da "Die Testverbindung war erfolgreich", bei allen anderen kommen Fehlermeldungen. Wenn ich SqlPassword, ActiveDirectoryPassword oder ActiveDirectoryIntegrated wähle, kommt folgende Fehlermeldung: "Es konnte eine Verbindung mit dem Server hergestellt werden, doch während des Anmeldevorgangs trat ein Fehler auf. (provider: SSL Provider, error: 0 - Die Zertifikatkette wurde von einer nicht vertrauenswürdigen Zertifizierungsstelle ausgestellt.)"

ActiveDirectiveInteractive gibt folgende Fehlermeldung:
"Authentication=Active Directory Interactive" kann nicht ohne die Schlüsselwörter "User ID" oder "UID" für die Verbindungszeichenfolge verwendet werden."

Kann es sein, dass ich in meiner Ubuntu Server Distribution, auf der mein SQL Server ja läuft fehlende SSL Komponenten installieren müsste, die standardmäßig nicht installiert sind, von SQL Server aber innerhalb der WindowsForms Anwendung dann aber benötigt werden?

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Nur im Connection String taucht es nicht auf..
Das Tool zeigt Dir das Passwort natürlich aus Sicherheitsgründen nicht an.
Es scheint also wirklich an dem Passwort zu liegen, aber wie bekomme ich das denn jetzt in den Connection String?
Hab Dir oben a) schon gezeigt wie der String mit Passwort aussehen sollte und b) einen Link gegeben, wo man alle Arten der SQL Connection Strings nachlesen kann, falls bisher gezeigte nicht für Deinen Fall passt.

Ich verstehe ehrlich gesagt nicht worauf du hinaus willst.. Ich kann den Connection String nicht manuell verändern indem ich da rein schreibe. Ich kann nur in den erweiterten Einstellungen der Datenverbindung (s. Anhang) bestimmte Dinge auswählen und der Connection String passt sich dann dementsprechend an. Ich schaffe es aber nicht dass der String so aussieht, wie von dir beschrieben, weil ich nicht weiß welche Dinge ich dafür in den entsprechenden Einstellungen ändern muss. (Passwort fehlt immer)

Muss das Passwort jetzt nun im String stehen und müsste es mir innerhalb der erweiterten Einstellungen im Connection String angezeigt werden, wenn ich alles richtig eingestellt hätte oder nicht aus Sicherheitsgründen? Das hat sich mir anhand deiner letzten 2 Nachrichten nicht voll erschlossen.

16.835 Beiträge seit 2008
vor einem Jahr

Erst durch die Info von Th69 hab ich verstanden, dass der kommentarlosen Screenshot nicht aus dem SQL Management Studio Data Explorer ist, sondern eine Data / WinForms Komponente.
Er ähnelt sich diesem Setup sehr. Ich wusste gar nicht, dass es diese sehr alte WinForms Komponente überhaupt noch gibt.

ActiveDirectiveInteractive gibt folgende Fehlermeldung:
"Authentication=Active Directory Interactive" kann nicht ohne die Schlüsselwörter "User ID" oder "UID" für die Verbindungszeichenfolge verwendet werden."

Wie gesagt, Du hast ein Setup, in dem Active Directory so auch gar nicht funktionieren kann.

Muss das Passwort jetzt nun im String stehen und müsste es mir innerhalb der erweiterten Einstellungen im Connection String angezeigt werden, wenn ich alles richtig eingestellt hätte oder nicht aus Sicherheitsgründen?

In dem Fenster, in dem Screenshot, steht unten in der Fußnote der Connection String. Und dass dort das Passwort nicht zu sehen ist, ist zumindest bei der Visual Studio Komponente (und ich denke auch bei dieser Komponente) "normal".
Trotzdem: die Applikation braucht zwingend das Passwort, sonst kann man sich am Server nicht anmelden.

Ich hab das nun mal nachvollzogen:
Wenn man den Data Source Wizard durch macht, kommt eine Abfrage (siehe Anhang), ob das Passwort gespeichert werden soll.
Hier steht auch, dass Du das Passwort selbst im Code setzen musst, wenn Du das Passwort durch den Wizard speichern lassen willst. Das war doch dann der Wizard, den Du gesehen hast, oder?
Das passt auch zu Deinem Satz:

Ich habe beim erstellen der Datenanbindung irgend ein Haken gesetzt, dass das Passwort besonders geschützt und nicht über diesen String übertragen werden soll, ich wusste nicht was das für Auswirkungen haben könnte und hielt es daher für eine sinnvolle Option.

Wenn Du also hier Nein gedrückt hast und keinen Code geschrieben hast, der das Passwort in den Connection String schreibt.
Woher soll dann die Anwendung das Passwort haben? Sie kann ja nicht hellsehen. In dem Wizard steht ja, dass Du das selbst tun musst.

Also ja: ist korrekt, dass man Credentials nicht hart in den Code schreibt.
Aber musst halt selbst Code schreiben, der das dann tut. In der Regel würde man das in den Windows Credential Manager schreiben - aber denke, dass das aktuell vom Level bisschen zu hoch ist. Ich müsste aber auch googlen, wie das in dem Zusammenhang mit den Data Source Komponenten funktioniert.
Versuch erstmal überhaupt eine Verbindung hin zu bekommen.

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Ich habe jetzt das Data Source Wizard selbst nochmal von vorn begonnen und den Haken bei der Frage nach dem Passwort im Connection String anders gesetzt, nämlich bei Ja. Nun gibt es keine Fehlermeldung mehr beim Starten des Programmes und es funktioniert soweit. Kam mir jetzt einfacher vor als noch irgendwo im Code rumzufuschen und das Passwort manuell zu setzen. Für meine Zwecke reicht dies aus. Ich bedanke mich für die Hilfe bei euch beiden, war ja jetzt letztendlich doch ein ziemlich banales Problem.

4.939 Beiträge seit 2008
vor einem Jahr

Mich würde noch interessieren, was sich an den Einstellungen dann geändert hat, nachdem du das Häkchen bei "ja" gesetzt hast.

A
AdmiralKuzan Themenstarter:in
14 Beiträge seit 2022
vor einem Jahr

Mich würde noch interessieren, was sich an den Einstellungen dann geändert hat, nachdem du das Häkchen bei "ja" gesetzt hast.

Soweit ich das beurteilen kann hat sich nur folgendes geändert: Persist Security Info ist nun False statt True und wird demnach auch nicht mehr im Connection String angezeigt.

4.939 Beiträge seit 2008
vor einem Jahr

Ja, das habe ich mir gedacht, aber das erklärt m.E. nicht, warum vorher das Passwort nicht beim ConnectionString angefügt wurde (es geht ja um das Setzen des Passworts und nicht um das Auslesen aus einer bestehenden Verbindung).
Aber du kannst dir merken, daß man Persist Security Info=true aus Sicherheitsgründen nicht setzen sollte: Schützen von Verbindungsinformationen: Verwenden von "Persist Security Info=False"