Die verborgenen Schatzkammern von MyLand – Isolated Storage

Vaubekien Folge 04

Die meisten Anwendungen müssen benutzerabhängige Daten irgendwo speichern. Doch wo ist der beste Platz? Sollten Konfigurationsdaten in einer Datenbank abgelegt werden? Oder in der Registry? Und das für jeden Benutzer? Es gibt eine interessante Alternative: Isolierte Speicherung, auf Englisch Isolated Storage.Das ist ein Mechanismus, der pro Anwender und pro Anwendung einen eigenen, von den anderen isolierten Speicherort auf der Festplatte zur Verfügung stellt.

Für diesen Speicherort gelten besondere Regeln. So kann Isolated Storage z.B. auch von Komponenten aus dem Internet verwendet werden, die ansonsten keine Rechte haben auf das Dateisystem zuzugreifen.

Auf dieser Seite
Die Isolierten Speicher von MyLand Die Isolierten Speicher von MyLand
Einführung Einführung
Die strikte Trennung Die strikte Trennung
Auf in die neue Speicherwelt Auf in die neue Speicherwelt
Zusammenfassung Zusammenfassung
Ressourcen Ressourcen
Über den Autor Über den Autor

Die Isolierten Speicher von MyLand

Die Bürger von Myland sind durch ihre bezaubernden Modekreationen berühmt und reich geworden. Viele Familien haben dadurch große Schätze angehäuft, die sie in ihren Isolated Storage genannten Schatzkammern verstecken, so dass sie nicht von anderen gefunden und verwendet werden können.

Dabei gibt es nicht nur eine Schatzkammer pro Familie. Vielmehr haben die Eltern ihre eigene, genauso wie die Kinder, die auch schon versuchen wirtschaftlich erfolgreich zu sein. Sind die Kinder zu Besuch bei den Großeltern, dann legen sie auch dort eine Schatzkammer an.

So hat jeder MyLander nicht nur eine Schatzkammer für sich, sondern an jedem Ort, an dem er aktiv ist seine eigene.

So ähnlich verhält es sich mit dem Isolierten Speicher im .NET Framework. Jede Assembly bekommt seinen eigenen Speicherbereich und wenn eine Assembly-DLL in verschiedenen Prozessen läuft, kann sie auch verschiedene Speicherbereiche haben.

Einführung

Wo würden Sie Konfigurationsdaten für den angemeldeten Benutzer speichern? Eine Variante ist die Registry, wo unter dem Schlüssel HKEY_CURRENT_USER Informationen gespeichert werden können. Was aber wenn Sie eine komplette XML-Konfigurationsdatei oder ein serialisiertes Objekt speichern möchten? Auch diese Informationen ließen sich in der Registry ablegen. Einfacher wäre es aber, die Daten im Dateisystem abzulegen.

Dadurch wird auch die Größe der Registry geschont, die sonst bei sehr vielen Anwendern stark wachsen würde. Eine große Registry verlangsamt das Gesamtsystem. Ein weiterer Aspekt ist, das auf die Registryschlüssel unter HKEY_CURRENT_USER jede Anwendung zugreifen kann. Die Anwendungsspeicher wären dann nicht voneinander isoliert.

Was machen Sie mit einer DLL, die im Global Assembly Cache installiert ist und die auch Daten auf die Festplatte schreiben möchte? Diese DLL kann von mehreren Anwendungen verwendet werden, die wiederum auf einem Terminalserver von mehreren Benutzern parallel gestartet werden. Jede Instanz der DLL möchte jedoch ihren eigenen kleinen Datenspeicher haben - wie die Bewohner von MyLand, die ihre Schätze auch nicht mit Familienmitgliedern teilen wollen.

Die strikte Trennung

Isolated Storage verwendet verschiedene Merkmale um diese Speicherbereiche auseinander zu halten. Jeder Benutzer hat zunächst einmal seinen eigenen Bereich auf der Festplatte, der normalerweise unter C:\Dokumente und Einstellungen\$USERNAME$\Lokale Einstellungen\Anwendungsdaten\IsolatedStorage zu finden ist.

Dort werden automatisch Verzeichnisse erstellt, die zum Beispiel so heißen: 0nxp1ndx.4bs. Darunter werden wiederum die Dateien und Verzeichnisse und dazugehörige Metadaten innerhalb (!) eines Isolated Storage angelegt.

Im Prinzip können diese Daten also auch über das normale Dateisystem gelesen werden, aber der Weg dahin ist aufwändig und Komponenten, die von nicht vertrauenswürdigen Zonen im Sinne des Security-Systems der Common Language Runtime stammen, dürfen auf das normale Dateisystem gar nicht zugreifen - wohl aber auf ihren eigenen Isolated Storage.

Arten der Isolierung

Für die Isolierung der Speicherorte werden drei verschiedene Identitäten unterschieden:

User
Identität der Assembly
Domain

Die Stores unterschiedlicher Anwender sind immer voneinander getrennt, das wird schon durch den Speicherort unter c:\...\Eigene Dateien\...sichergestellt.

Die Identität einer Assembly wird über ihren Strong Name festgestellt, existiert dieser nicht, dann werden Url oder Pfad ihrer Herkunft verwendet.

Wenn nun aber die gleiche DLL von zwei verschiedenen Host-Assemblies verwendet wird, dann muss ein weiteres Unterscheidungsmerkmal her: die Application-Domain, die die DLL lädt. Und das ist dann wiederum ein Strong Name oder eine URL bzw. ein Pfad des Host-Assemblies.So kann also jedes MyLänder-Kind eine eigene Schatzkammer in jedem Haus nur für sich bekommen.

Roaming Profiles

Isolierter Speicher ist normalerweise auf einen Computer beschränkt. Meldet sich ein Anwender auf einem anderen Computer an, dann müsste er alle Daten erneut speichern.

Wenn für einen Windows Anwender Roaming Profiles unterstützt werden, dann können aber auch die Daten des Isolated Storage dem Anwender auf jedem Computer im Netzwerk zur Verfügung stehen, eine mobile Schatzkammer so zu sagen.

Allerdings sollte darauf geachtet werden, dass die Daten nicht zu groß werden, sonst dauert die Anmeldung des Benutzers zu lange. Das Abspeichern der privaten Fotogalerie ist also keine so gute Idee, zumal für den Isolated Storage eine Größenbeschränkung existiert um Denial of Service Attacken zu erschweren. Diese Grenze kann vom Administrator festgelegt werden. In einer mobilen Schatzkammer würde man ja auch nicht seine Gemäldesammlung mitnehmen.

Auf in die neue Speicherwelt

Eine Datei schreiben

Nun aber genug der grauen Theorie. Lassen Sie uns eine Datei in den Isolierten Speicher schreiben. Die Klasse IsolatedStorageFile stellt uns einen solchen Isolierten Speicherbereich zur Verfügung, repräsentiert also weniger eine Datei, als einen Speicherort, innerhalb (!) dessen mehrere Dateien und Ordner erstellt werden können. Der Klassenname mit „File“ am Ende ist also etwas missverständlich.

Der eigentlichen Zugriff zum lesen und schreiben von Dateien erfolgt dann über das IsolatedStorageFileStream-Objekt. Dieses kann mit den üblichen StreamReader und StreamWriter-Objekten aus dem System.IO-Namensraum verwendet werden.

Über die statische (Shared) Methode GetUserStoreForDomain erhalten Sie eine Referenz auf ein IsolatedStorageFile-Objekt. Über dieses Objekt können Sie ihr kleines Schatzkästlein verwalten und strukturieren (z.B. durch Anlage von Verzeichnissen), siehe Tabelle 1.

Tabelle 1: Methoden des IsolatedStorageFile-Objektes

CreateDirectory, DeleteDirectory

GetFileNames, GetDirectoryNames

DeleteFile

Mit dem IsolatedStorageFile-Objektes können Sie einen IsolatedStorageFileStream erstellen und diesen können Sie dann wie andere Stream-Objekte auch verwenden und z.B. mit Hilfe eines StreamWriter beschreiben:

Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Xml 

Public Sub WriteIsoStorageFile
   Dim IsoStore As IsolatedStorageFile = 
      IsolatedStorageFile.GetUserStoreForDomain()
   Dim isoStream As New IsolatedStorageFileStream("schatzkammer.xml", _
      FileMode.Create, IsoStore)

   Dim xSW As XmlTextWriter = New XmlTextWriter(isoStream, _
      System.Text.Encoding.UTF8)

   xSW.WriteStartDocument()
   xSW.WriteStartElement("Schätze")
   For Each i As Object In New String() {"Siegelring", "Goldkette", "Amulett"}
      xSW.WriteElementString("Schatz", i.ToString)
   Next
   xSW.WriteEndElement()

   xSW.Flush()
   xSW.Close()

   isoStream.Close()
   IsoStore.Close()
End Sub

Strong Names

Damit Assembliy-Identitäten nicht von ihrem Speicherort (URL) abhängig sind, sollten diese mit einem Strong Name signiert werden. So kann die Assembly auf ihre Schatzkammer zugreifen, auch wenn es auf der Festplatte herumreist.

Das geschieht in Visual Studio 2005 ganz einfach über den My Project Designer. Sie erreichen ihn über den Solution Explorer, dort finden Sie direkt unterhalb des Projektes den Knoten My Project und über ihn gelangen Sie zum Designer. Der Designer verfügt über eine Karteikarte Signing und dort können Sie ein Strong Name Key File erzeugen und dem Assembly zuweisen.

Eine Datei lesen

Das Lesen ist ähnlich einfach wie das Schreiben. Sie benötigen wieder IsolatedStorageFile- und IsolatedStorageFileStream-Objekte und können dann mit einem beliebigen StreamReader-Objekt die Datei auslesen. Über die GetFileNames-Methode können Sie alle Dateinamen des Speicherortes ermitteln:

Dim myIsoStore As IsolatedStorageFile
myIsoStore = IsolatedStorageFile.GetUserStoreForDomain()

Dim StoreFileNames As String()
StoreFileNames = myIsoStore.GetFileNames("schatzkammer.xml")

If StoreFileNames.Length = 1 Then
    Dim stmReader As New StreamReader( _
         New IsolatedStorageFileStream(StoreFileNames(0), _
                FileMode.Open, myIsoStore))
    Dim xmlReader As New XmlTextReader(stmReader)
    …
    xmlReader.Close()
    stmReader.Close()
Else
    MsgBox("This File Name was not found in the Store!", MsgBoxStyle.Exclamation)
End If

myIsoStore.Close()

Zusammenfassung

So haben die Myländer also ein ausgeklügeltes System von Schatzkammern erdacht, das es Schatzjägern schwer machen dürfte. So sind zwar die Schätze irgendwo auf der Festplatte gespeichert, dort aber nur schwer zu finden. Nur die Berechtigten kommen kinderleicht an Ihre Daten. Besonders schön gelungen scheint mir die Trennung der Speicherbereiche voneinander. So kann es nicht zum Streit über die Datenschätze kommen.

Der Isolated Storage Mechanismus wird bis jetzt nur selten verwendet, weil er den meisten Entwicklern noch unbekannt ist. Er bietet eine einfache Möglichkeit Dateien nach Benutzern und Anwendungen getrennt auf die Festplatte zu schreiben. Mit der zunehmenden Verbreitung von Terminalservern, aber auch Webanwendungen wird diese Aufgabe immer wichtiger.

Einen zweiten Aspekt stellt die Sicherheit dar. Komponenten, die aus dem Internet oder Intranet herunter geladen werden gelten als nicht voll vertrauenswürdig und haben keine Möglichkeit direkt auf die Festplatte zu schreiben. Isolated Storage bietet einen fest vorgegebenen und beschränkten Platz, wo diese Komponenten Dateien ablegen dürfen.

Ressourcen

Chris Tavares, Understanding Isolated Storage,
http://www.dotnetdevs.com/articles/IsolatedStorage.aspx

MSDN, Isolated Storage,
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconIsolatedStorage.asp

MSDN, Isolated Storage Tool,
http://msdn.microsoft.com/library/en-us/cptools/html/cpgrfisolatedstorageutilitystoreadmexe.asp

Über den Autor

Marcel Gnoth

Marcel Gnoth liest leidenschaftlich gern Reisegeschichten und schreibt auch über seine eigenen Reisen. Wenn er in Deutschland ist, dann verdient er sich sein Geld für die Reisen mit der .net Entwicklung bei der Berliner NTeam GmbH. Weitere Informationen finden Sie unter http://www.gnoth.net/ .