Announcement

Collapse
No announcement yet.

Server/Datenbank/User/Kennwort überprüfen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Server/Datenbank/User/Kennwort überprüfen

    Hallo,

    ich versuche mich grad an einem Programm was auf eine SQL-DB zugreifen soll.
    Damit ich nicht immer den Designer nehmen muss sondern alles im Code abfackeln kann fang ich also mal direkt beim nicht erlernten Urschleim an.

    mein code:
    Code:
    Private Sub ConOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConOpen.Click
           Try
                Dim MconBuilder As SqlConnectionStringBuilder = _
                          New SqlConnectionStringBuilder()
                MconBuilder.DataSource = "S015"
                MconBuilder.InitialCatalog = "Test"
                MconBuilder.Add("Trusted_Connection", "yes")
                Dim Mcon As DbConnection = New SqlConnection(MconBuilder.ConnectionString)
                Mcon.Open()
            Catch ex As SqlException 'Exception
                MsgBox(ex.Message)
            End Try
            
    End Sub
    meine Frage:
    die angegebene Datasource ist falsch. wie kann ich das abfangen?
    die Ex.message sagt immer er könne die DB nicht auf dem Server öffnen, was ja auch logisch ist wenn es den nicht gibt...
    wie kann ich eine ex erzeugen/bekommen in der steht "Server nicht im Netzwerk"
    selbiges kommt ja dann auch per Catalog, UserId, Passwort....

    ideen? Lösungen??
    Ich hab keine Ahnung was ich tue aber ich will es lernen

  • #2
    Den Server selbst anpingen?

    Ich bezweifle das du durch irgendwelche Einstellungen an der DBConnection detailliertere Fehlermeldungen bekommst. In diesem Bereich wäre das ein Sicherheitsrisiko. Wäre ja für jeden Angreifer nett wenn er alle Details einfach so verraten bekommt, so nach dem Motto 'Den Server gibts, beim Port liegst du leicht daneben, Usernamen ist ein Volltreffer aber am Passwort musst du noch arbeiten'.
    Zum Debuggen ist das sicherlich störend aber die DBConnection sollte möglichst nicht viel mehr verraten als 'geht nicht'.

    Comment


    • #3
      ok so betrachtet ist das natürlich ein argument...

      aber die Datenbanken auf einem Server bzw. deren Tabellen muss ich doch irgendwie erfragen können (sofern mein User die Berechtigungen hat, ist klar).

      Hintergrund ist einfach das ich die Loginmaske natürlich relativ Userfreundlich machen will, und dem User schon sagen will das er entweder die falsche DB hat oder aber diese schon richtig ist aber er nicht rein darf.

      was Sicherheit angeht brauch ich mir hier zum Glück nicht ganz so eine risesn sorge machen da wir abgeriegelt sind...

      tips?
      Ich hab keine Ahnung was ich tue aber ich will es lernen

      Comment


      • #4
        Um die laufenden SQL Server Instanzen in einem lokalen Netz zu finden hilft die
        SqlDataSourceEnumerator Klasse.

        Die Namen aller Datenbank Instanzen bekommst du z.B. so (habs gerade nur in C#, sorry)

        Code:
                public static List<string> InstanceNames()
                {
                    List<string> databases = new List<string>();
                    SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
                    DataTable dataTable = instance.GetDataSources();
        
                    foreach (DataRow row in dataTable.Rows)
                    {
                        if (row["Version"].ToString() != "")
                        {
                            string serverName = row["Servername"].ToString();
                            if (row["InstanceName"].ToString() != "")
                            {
                                serverName += "\\" + row["InstanceName"].ToString();
                            }
                            databases.Add(serverName);
                        }
                    }
                    return databases;
                }

        Wie man an die Datenbank auf der Datenbank Instanz kommt weiß ich gerade nicht. Es gibt wahrscheinlich auch irgendeine Funktion (wenn dann an der DBConnection) die einem das liefert ansonsten kannst du dich sobald du eine DB Instanz kennst dich zur dortigen Masterdatenbank verbinden und die sysdatabases Tabelle abfragen und die Datenbank Namen auslesen.

        Comment


        • #5
          Hallo Ralf,

          verdammt und von C# hab ich noch weniger Plan als ich eh schon hab...
          hmm...

          ich hab das Konzept nochmal überdacht, aufgrund deines Hinweises, und habe beschloßen den Server & die Datenbank im Sourcecode fest zu hinterlegen und den Rest über trusted_connection zu machen.

          Dann brauch ich auch nur ein paar Securitygroups auf dem SQL berechtigen und als Login anlegen das ist viel relaxter. Und es kommt keiner auf die Idee/Verlegenheit in den Textboxen evtl. zusätzlichen Code einzufügen und abzufeuern und so evtl. Schäden anzurichten...

          Aufgrund dieser Änderung bin ich aber gezungen zur Laufzeit des Programms mindestens den "Serverstatus" aubzufragen. Hintergrund ist das es ja auch mal Patch-Installationen gibt und ähnliches bei dem der Server neugestartet wird also die Netzwerkverbindungen down sind. Ich möchte das sich mein Programm dann in den "Wartungsmodus" begibt, bis ein anderer Status übergeben wird.

          Eigentlich muss ich ja nur einen Status des Servers haben der sagt ich bin da oder nicht.

          Ich weiß eigentlich auch wieder ein Ping... geht das denn?
          und wenn ja auch in VB?
          Ich hab keine Ahnung was ich tue aber ich will es lernen

          Comment


          • #6
            neue Idee:
            kann ich den Serverstatus über das AD bekommen?
            erste provisorische Lösung:
            Code:
            if my.computer.network.ping("S015") = true then
            ...
            else
            GrpUnderconstruction.visible = true
            end if
            achso Nachtrag:
            die GrpUnderconstruction ist ein Container der alle Steuerelemente in der StartForm überlagert.
            der Ping ist in unserem Netz zwar relativ unwichtig, ich finde es allerding trotzdem nicht schön, da der Server selber ja online sein kann aber der SQL-Server Dienst evtl. klemmt.
            Netzwerklast habe ich errechnet mit 3(alle 20sec oder bei aktivierung)*300(rechner)*32Bytes = 28800bytes

            eine weitere Idee die ich hatte ist alle 20 sec ein sql statement abzufeuern
            Code:
            select databasepropertyex('master', 'status')
            allerdings bin ich mit ADO noch nicht so ganz grün...
            Meine Frage:
            1. Wie initialisiere ich die Verbindung zum Server so das ich sie aus den verschiedenen Sub´s und in den Verschiedenen Forms abrufen kann.

            2. auf die Abfrage wird im SQL-Managementstudio ein "Online" zurückgegeben.
            Wie kann ich diesen Wert im Programm/Form empfangen/verarbeiten?

            Ich weiß ganz schön viel zum Freitagabend...

            Server = S05
            DB = Test_db
            Intigrierte Security soll verwendet werden.

            Für ein paar Codebeispiele / andere Ideen wäre ich echt dankbar.

            Viele Grüße und ein schönes WE
            André
            Zuletzt editiert von Undeathly_Shadow; 13.11.2009, 18:20. Reason: Nachtrag zum Post
            Ich hab keine Ahnung was ich tue aber ich will es lernen

            Comment


            • #7
              Keine Statements dazu? oder hats nur keiner gelesen weil ich es als Änderung drangehangen habe?
              Ich hab keine Ahnung was ich tue aber ich will es lernen

              Comment

              Working...
              X