Announcement

Collapse
No announcement yet.

Inhalt von Textboxen in XML-Datei schreiben

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

  • Inhalt von Textboxen in XML-Datei schreiben

    Hallo,

    ich bin Quereinsteiger habe ein bisschen in VB6 programmiert und viel in VBA. Jetzt will ich mich weiterentwickeln um auch richtige Programme schreiben zu können.

    Einige Handbücher hab ich mir schon gekauft, die mir meinen Weg ein bisschen bereitet haben.

    Ich stehe vor einem Projekt mit einer Server als Datenquelle. Nun will ich die Connection-Informationen natürlich nicht für jedermann änderbar machen. Deshalb hab ich mir gedacht, schreibe ich ein Extra-Programm welches mir eine XML-Datei aufruft (in der Verschlüsselte Informationen stehen) und die dann in die entsprechenden Textboxen einfügt. Mit einer unverschlüsselten XML-Datei ist mir das bereits gelungen.
    Nun zu meinem eigentlichen Problem. Wenn ich Änderungen an den Angaben mache, muss er das natürlich auch in die XML-Datei wieder schreiben. Das ganze muss natürlich auf verschlüsselter Basis funktionieren.


    Kann mir jemand dabei helfen?

  • #2
    Hallo,

    dazu gibt es viele Möglichkeiten.

    Wenn man es nur darauf bezieht, was in der Überschrift steht, dann sind die Möglichkeiten von XmlDocument genauer zu untersuchen. Da bist Du dann völlig frei und flexibel, was Du wo abspeichern willst. Du musst lediglich beachten, dass immer die gesamte Datei benutzt (gelesen und gespeichert) werden muss; es ist nicht möglich, mittendrin etwas zu ändern (wie das ja auch bei einer Datei auf der Festplatte nicht geht).

    Die spezielle Frage nach Benutzername + Passwort bei einem ConnectionString kann mit dem Hinweis auf app.config und/oder user.config und den Klassen im System.Configuration-Namespace beantwortet werden. Einzelheiten werden unter DB-Password/Kennwort/Connection-String sicher speichern und den dort genannten Links besprochen.

    Gruß Jürgen

    Comment


    • #3
      Hallo Jürgen,

      vielen Dank für deine rasche Antwort.
      Wie bereits erwähnt wollte ich die DB-Konfigurationsdaten nicht im Programm hinterlegen, sondern in einer Datei (sei es XML oder sonst was) damit ich die auch ohne das Programm starten zu müssen ändern kann.


      Habs durch langes suchen in Google und sämtlichen Foren geschafft, das er mir die Daten aus den Textboxen ausliest und dann verschlüsselt abspeichert.
      Aber mein Problem ist jetzt das entschlüsseln. Irgendwie legt er mir da immer eine XML-Datei an, die nicht wirklich die Werte enthält die ich brauche.


      Hier die Links für die Snippets zum Ver- und Entschlüsseln:

      Verschlüsseln & Entschlüsseln


      Mein Quellcode:
      Code:
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Windows.Forms;
      using System.Security.Cryptography.Xml;
      using System.Security.Cryptography;
      using System.Xml;
      using System.IO;
      
      namespace XML_Auslesen
      {
          public partial class Datenbankeigenschaften : Form
          {
              string strdesktoppath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
      
              public Datenbankeigenschaften()
              {
                  InitializeComponent();
              }
      
              private void btnLoad_Click(object sender, EventArgs e)
              {
                  string strxmlpath = strdesktoppath + "\\db.xml";
      
                  Decryptdata(strxmlpath, "");
                  
      
                  //XmlDocument SettingsXML = new XmlDocument();
                  //SettingsXML.Load(strxmlpath);
                  //XmlElement root = SettingsXML.DocumentElement;
                  //foreach (XmlNode @Settingdaten in root.ChildNodes)
                  //{
                   //   tboxServertype.Text = (@Settingdaten.Attributes["servertype"].InnerText);
                   //   tboxServertype.Text = (@Settingdaten.Attributes["servername"].InnerText);
                   //   tboxServertype.Text = (@Settingdaten.Attributes["username"].InnerText);
                   //   tboxServertype.Text = (@Settingdaten.Attributes["password"].InnerText);
                   //   tboxServertype.Text = (@Settingdaten.Attributes["database"].InnerText);
                  //}
                  btnSave_Click(sender,e);
              }
      
              private void btnSave_Click(object sender, EventArgs e)
              {
                  string strxmlpath = strdesktoppath + "\\db.xml";
      
                  XmlTextWriter myXmlTextWriter = new XmlTextWriter(strxmlpath, System.Text.Encoding.UTF8);
                  myXmlTextWriter.Formatting = Formatting.Indented;
                  myXmlTextWriter.WriteStartDocument(false);
      
                  myXmlTextWriter.WriteComment("Copyright");
      
                  myXmlTextWriter.WriteStartElement("DB-Config");
      
                  myXmlTextWriter.WriteElementString("servertype", tboxServertype.Text);
                  myXmlTextWriter.WriteElementString("servername", tboxServername.Text);
                  myXmlTextWriter.WriteElementString("username", tboxUsername.Text);
                  myXmlTextWriter.WriteElementString("password", tboxPassword.Text);
                  myXmlTextWriter.WriteElementString("database", cboxDatabase.Text);
      
                  myXmlTextWriter.WriteEndElement();
      
                  myXmlTextWriter.Flush();
                  myXmlTextWriter.Close();
      
                  DataSet SettingsXML = new DataSet();
                  EncryptData(strxmlpath, SettingsXML, "");
      
              }
      
              public void EncryptData(string file, DataSet ds, string key)
              {
                  Rijndael crypto = Rijndael.Create();
                  // qwert bitte durch einen eigenen String ersetzten
                  crypto.IV = ASCIIEncoding.ASCII.GetBytes("".PadRight(16, 'x'));
                  crypto.Key = ASCIIEncoding.ASCII.GetBytes(key.PadRight(16, 'x'));
                  crypto.Padding = PaddingMode.Zeros;
      
                  File.Delete(file);
      
                  using (FileStream stream = new FileStream(file, FileMode.OpenOrCreate))
                  {
                      using (CryptoStream cryptoStream = new CryptoStream(stream, crypto.CreateEncryptor(), CryptoStreamMode.Write))
                      {
                          ds.WriteXml(cryptoStream);
                          cryptoStream.Flush();
                          stream.Flush();
                          cryptoStream.Close();
                          stream.Close();
                      }
                  }
              }
      
              public DataSet Decryptdata(string file, string key)
              {
                  Rijndael crypto = Rijndael.Create();
                  // qwert bitte durch einen eigenen String ersetzten
                  crypto.IV = ASCIIEncoding.ASCII.GetBytes("".PadRight(16, 'x'));
                  crypto.Key = ASCIIEncoding.ASCII.GetBytes(key.PadRight(16, 'x'));
                  crypto.Padding = PaddingMode.Zeros;
      
                  DataSet ds = new DataSet();
                  using (FileStream stream = new FileStream(file, FileMode.Open))
                  {
                      using (CryptoStream cryptoStream = new CryptoStream(stream, crypto.CreateDecryptor(), CryptoStreamMode.Read))
                      {
                          ds.ReadXml(cryptoStream);
                          cryptoStream.Close();
                          stream.Close();
                      }
                  }
                  ds.WriteXml(file);
                  return ds;
              }
          }
      }
      Wenn ich mir die XML-Datei anschaue, bevor die Methode zum verschlüsseln aufgerufen wird, dann stehen da die richtigen Daten drin. Nach dem Verschlüsseln steht nur noch Salat drin.

      Nach dem Entschlüsseln steht sowas wie
      Code:
      <?xml version="1.0" standalone="yes"?>
      <NewDataSet />
      drin.


      Weiß jemand Rat?
      Zuletzt editiert von MasterTH; 05.03.2009, 18:45.

      Comment


      • #4
        Hallo,

        ich will jetzt nicht alles verstehen, was Du versuchst. (Gerade beim Ver- und Entschlüsseln gibt es mindestens Hunderte von Verfahren.) Aber es ist auf jeden Fall abwegig: ein neues DataSet zu erstellen (ohne DataTables, ohne Datensätze), dies an eine andere Methode zu übergeben, dort irgendetwas anderes (!) zu machen und abschließend das ursprüngliche, nackte DataSet zu speichern. Es sollte einleuchten, dass auch die entsprechende xml-Datei nackt ist.
        DataSet brauchst Du wirklich nur, wenn Du strukturierte Daten zusammenfassen willst.

        Vielleicht solltest Du nochmals (z.B. in einem Struktogramm) eine eigene Klasse MyXmlSettings konzipieren.

        Jürgen

        Comment

        Working...
        X