2009-07-16 2 views
2

Ich muss wissen, wo und wie Anwendungseinstellungen (Verbindungszeichenfolge) gespeichert werden können, so dass sie zur Laufzeit geändert und gespeichert werden können.Unklarheit darüber, wo Anwendungseinstellungen in .NET Win-Anwendungen gespeichert werden müssen

Ich weiß in VS können Sie Einstellungen unter Projekt> Eigenschaften konfigurieren und diese in der Datei appname.exe.config unter Apps Installationsverzeichnis gespeichert werden. Aber die "Anwendungsbereich" diejenigen sind nicht lesen/schreiben zur Laufzeit und wenn Sie ändern die unter Benutzerbereich eine Kopie der Konfigurationsdatei wird unter Benutzerverzeichnis erstellt und nicht von anderen Benutzern der Anwendung zugegriffen werden.

Ich muss einen Weg haben, so dass der Benutzer Verbindungszeichenfolge konfigurieren kann, in einer gemeinsamen Konfigurationsdatei gespeichert, nach ihren Bedürfnissen aus der App heraus und dann alle anderen Benutzer (auf dieser Maschine) können diese auch verwenden. Wie kann ich das erreichen?

+0

Die Antwort auf Ihre Frage scheint zu sein, dass Sie Benutzereinstellungen verwenden sollten.Da Sie jedoch bereits erwähnt haben, bin ich mir nicht sicher, was Ihr Problem ist. Möchten Sie, dass alle Benutzer dieselbe Verbindungszeichenfolge verwenden, diese jedoch anpassen können? –

+0

Ja. Ich möchte, dass alle Benutzer die gleiche Verbindungszeichenfolge verwenden und anpassen. – superartsy

+0

Aus einem Ihrer anderen Kommentare scheint es, dass Sie in der Lage sein möchten, Ihre Anwendung zu verwalten. Wenn Sie sich in einem aktiven Verzeichnis befinden, können Sie eine Gruppenrichtlinie für die Anwendungsverwaltung verwenden. Wenn die Datenbank verschoben wird, aktualisieren Sie Ihre Richtlinie und alle Benutzer werden automatisch aktualisiert. Der Aufwand ist jedoch wahrscheinlich mehr als Sie investieren möchten. –

Antwort

9

Die einfachste und schnellste Lösung besteht darin, eine Konfigurationsdatei an einem freigegebenen Speicherort zu erstellen, an dem normale Benutzer Lese- und Schreibrechte haben.

Erstellen Sie eine Klasse mit öffentlichen Eigenschaften für Ihre Konfigurationsdaten, und serialisieren Sie sie an diesem freigegebenen Speicherort in XML.

public class Configuration 
{ 
    // config filename 
    private static _name = Path.Combine(
     System.Environment.GetFolderPath(
     Environment.SpecialFolder.CommonApplicationData), 
     @"MyApp\MyConfig.xml"); 

    // the connection string 
    public string ConnectionString {get;set;} 

    // load the configuration from disk 
    public static Configuration Load() 
    { 
    using (var f = File.OpenRead(name)) 
    { 
     var x = new System.Xml.Serialization.XmlSerializer(typeof(Configuration)); 
     return x.Deserialize(f) as Configuration; 
    } 
    } 

    // save the configuration to disk 
    public static Save(Configuration config) 
    { 
    using (var f = File.OpenWrite(name)) 
    { 
     var x = new System.Xml.Serialization.XmlSerializer(typeof(Configuration)); 
     x.Serialize(f, config); 
    } 
    } 
} 
+0

Ich hatte Angst, dass dies die einzige Option wäre. Aber gibt es wirklich keinen einfacheren Weg dies zu tun? – superartsy

+1

Ich würde Environment.SpecialFolder.CommonApplicationData anstelle des oben genannten Pfades verwenden, aber ansonsten glaube ich nicht, dass es anders geht. – MusiGenesis

+1

Ich denke, er wäre besser dran, die Standard-Konfiguration-Klassen zu verwenden, um dies zu tun, da er dann ihre integrierte Funktionalität nutzen könnte, wenn seine All-User-Konfiguration komplexer wird. (ConfigurationManager.OpenExeConfiguration lässt einen beliebigen Pfad zur Konfigurationsdatei zu.) –

0

Das Lesen und Schreiben in die Registrierung war früher die empfohlene Methode zum Speichern von Benutzereinstellungen, und Sie können dies trotzdem problemlos durchführen (mit Microsoft.Win32.Registry), aber es gibt Probleme mit diesem Ansatz (hauptsächlich aufgrund unterschiedlicher Berechtigungen) Ebenen unter Ihren Benutzern - einige Benutzer dürfen nicht in einige Teile der Registrierung schreiben oder neue Schlüssel erstellen.

+0

Ich würde dies vermeiden, da Sie sich beim Berühren der Registrierung mit Benutzerrechten konfrontiert sehen. – Will

+0

Die Registrierung ist in HKEY_LOCAL_MACHINE und HKEY_CURRENT_USER partitioniert, genau wie die Anwendungseinstellungen in Anwendungsumfang und Benutzerbereich partitioniert sind. Der Wechsel von den Anwendungseinstellungen zur Registrierung hilft nicht, Probleme mit Privilegien zu umgehen. –

+0

Es würde eigentlich gut funktionieren, wenn sie in den Benutzerbereich der Registry geschrieben hätten, aber ich denke, der Fragesteller möchte eigentlich eine globale Einstellung, die jeder Benutzer ändern kann. – MusiGenesis

5

Anwendungsbereich Verbindungszeichenfolgen sind beschreibbar, aber Sie müssen anders als nur die Zeichenfolge für die Verwendung abrufen. Zum Beispiel:

Sie sollten auch den Abschnitt aktualisieren, damit die Änderung ordnungsgemäß abgerufen wird. Unmittelbar danach:

+0

wird dies auch unter der UAC-Umgebung von Vista funktionieren? – superartsy

+2

Die Konfigurationsdatei kann nur gespeichert werden, wenn der Benutzer über die erforderlichen Rechte für das zugrunde liegende Dateisystem verfügt. –

+1

Nur wenn der Benutzer Administratorzugriff hat, was auf einem Einzelbenutzercomputer sehr wahrscheinlich ist. (Und wenn es sich um einen Computer mit mehreren Benutzern handelt, möchten Sie wahrscheinlich nur, dass der Administrator diese Einstellung ändert.) –

0

Sie haben einige widersprüchliche Elemente in Ihrer Frage:

Anwendungseinstellungen (Verbindungen string) gespeichert werden, so dass sie während der Laufzeit und gespeichert geändert werden kann.

.

Anwendungsbereich“Einsen werden nicht gelesen/Schreib zur Laufzeit, und wenn Sie die, die unter Benutzerbereich-Datei eine Kopie der Konfiguration ändern wird unter Benutzer-Verzeichnis erstellt und pflegt die von anderen Benutzern der Anwendung zugegriffen werden.

Best Practices diktieren, dass die Einstellungen (wie Verbindungszeichenfolgen), die Sie sollten nicht sein veränderbar von jeder beliebigen Benutzer des Systems. Diese Art von Einstellung sollte jeder Benutzer eines Systems zu anwenden möchten nur von jemandem geändert werden, der für die Verwaltung qualifiziert ist r das System.

Daher ist das Verhalten, das Sie beschreiben, genau das, was beabsichtigt ist. Wenn Sie es wirklich zulassen wollen, dass Benutzer dies ändern, dann machen Sie es zu einer Benutzereinstellung. Wenn also ein Benutzer es vermasselt, wird es nur für seinen eigenen Account vermasselt.

+0

Ja in einer IDEAL-Welt sind Sie richtig, etwas, das jeden betrifft, sollte nur von einer Autorität geändert werden.Mehr als "Wechseln nach dem Gebrauch", von dem wir sprechen, ist "initial setup". Nach der Bereitstellung möchte ich dem Benutzer eine einfache Form geben, über die er den Server und die Datenbank auswählen kann, mit der er sich verbinden möchte. Dies geschieht normalerweise nur einmal oder wenn das Netzwerk Änderungen erfährt. – superartsy

+0

Und was ist daran falsch, dass jeder Benutzer das macht? –

1

Die Art, wie ich es gemacht habe, war, dass ich eine XML-Datei speicherte, die von einem POCO-Objekt mit SQL-Verbindungsinformationen in isoliertem Speicher serialisiert wurde. Da es für das Benutzerkonto, das von dort lesen und schreiben kann, keine wirklichen Einschränkungen gibt, müssen Sie sich keine Gedanken über Benutzerberechtigungen machen.

Ich änderte dann die Einstellungen Ereignisse, so dass, wenn die Verbindungszeichenfolge-Eigenschaft aus der App-Einstellungsdatei gelesen wurde, ich die XML-Datei im isolierten Speicher deserialisiert, baute die Verbindungszeichenfolge und dann in die Verbindungszeichenfolge App-Einstellungen Eigentum. Da ich dies in der Settings-Klasse selbst gemacht habe, konnte ich darauf schreiben (aber nicht in die Datei zurückspeichern).

Wenn meine App läuft, wenn sie keine Verbindung zum Server herstellen kann, öffne ich einfach ein Fenster und frage nach den SQL Server Informationen und sie tippen sie ein und speichern sie im isolierten Speicher, niemals danach fragen wieder (auch durch Upgrades).

Wenn Sie eine Client-Anwendung (WPF oder WinForms) haben, können Benutzer auf anderen Rechnern dies nicht verwenden und ehrlich gesagt werden Sie wahrscheinlich keine Lösung dafür finden, es sei denn, Sie betrachten .Net Remoting oder etwas anderes diese Natur. Wenn Sie jedoch mehrere Benutzer auf dem SAME-Computer in einer WinForms-App haben, können Sie den IsolatedStorage verwenden, der für alle Benutzer funktioniert.

In den Einstellungen Klasse, fügen Sie diese Event-Handler:

VB:

Private Sub MySettings_SettingsLoaded(ByVal sender As Object, ByVal e As System.Configuration.SettingsLoadedEventArgs) Handles Me.SettingsLoaded 
    Me.Item("MyAppConnectionString") = MyLibrary.BuildConnectionString() 
End Sub 

C#:

protected override void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e) 
{ 
    base.OnSettingsLoaded(sender, e); 
    this["MyAppConnectionString"] = MyLibrary.BuildConnectionString(); 
} 
+0

Ich mag das! es ist eine ziemlich einzigartige Art, Dinge zu tun. Außer ich sehe ein kleines Problem.Wenn Sie eine serialisierbare Klasse zum Speichern von Einstellungen verwenden, kann es immer zu Problemen mit der Versionierung kommen. Es gibt auch einen Grund, warum Sie Isolated Storage über den Ordner Common_AppData ausgewählt haben. – superartsy

+0

Für die Versionierung hängt es davon ab, wie Sie Ihre Einstellungen speichern. Wenn wir beim Deserialisieren eine Eigenschaft hinzufügen, ist das meistens kein Problem, da diese Eigenschaft nur als Null eingelesen wird. Ihre Meilenzahl wird variieren. Wir fügen diesen Klassen häufig keine Eigenschaften hinzu, da wir diese nur für Dinge wie das Festlegen der Verbindungszeichenfolge oder das Speichern von Druckereinstellungen verwenden. Wir wählen isolierten Speicher, weil es etwas ist, das für alle schreibbar ist und irgendwie "versteckt" ist, wo die Leute nicht hinsehen können. – TheCodeMonk

2

Wie andere haben Sie auf die eine gemeinsame Position erstellen müssen darauf hingewiesen, Computer, der von allen Benutzern Ihrer Anwendung beschreibbar ist. Dieser Speicherort kann ein Ordner, eine Datei oder die Registrierung sein. Windows hat jedoch tatsächlich einen Speicherort dafür. Sie können mehr darüber auf MSDN lesen. Der Ordner, den Sie benötigen, ist für gemeinsame Anwendungsdaten:

CSIDL_COMMON_APPDATA

Dieser Ordner sollte für Anwendungsdaten verwendet werden, die nicht vom Benutzer spezifisch ist. Beispielsweise kann eine Anwendung ein Wörterbuch für die Rechtschreibprüfung, eine Clip-Art-Datenbank oder eine Protokolldatei im Ordner CSIDL_COMMON_APPDATA speichern. Diese Information wird nicht roamen und steht jedem zur Verfügung, der den Computer benutzt. Standardmäßig ist dieser Speicherort nur für normale (Nicht-Admin-, Nicht-Power-) Benutzer schreibgeschützt. Wenn eine Anwendung normalen Benutzern Schreibzugriff auf ein anwendungsspezifisches Unterverzeichnis von CSIDL_COMMON_APPDATA erfordert, muss die Anwendung die Sicherheit in diesem Unterverzeichnis während der Anwendungseinrichtung explizit ändern. Die geänderte Sicherheit muss im Lieferantenfragebogen dokumentiert werden.

Sie können die Position dieses Ordners erhalten, indem

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

in Ihrer .NET-Anwendung aufrufen. Unter Vista ist dieser Ordner normalerweise C:\ProgramData.

Sie müssen Ihren eigenen hersteller- und anwendungsspezifischen Ordner im freigegebenen Ordner erstellen. Dies sollte von einem Installationsprogramm mit erhöhten Rechten ausgeführt werden. Dieses Installationsprogramm sollte außerdem sicherstellen, dass die Benutzer über die erforderlichen Berechtigungen verfügen, um Schreibzugriff wie im obigen Zitat zu erhalten.

+0

Danke. Ich wusste davon und wir haben Anwendungen, die gemeinsame Dateien unter diesem Verzeichnis auch speichern. Allerdings würde das Speichern von Konfigurationseigenschaften bedeuten, dass ich sie selbst lesen/schreiben/serialisieren muss. Ich habe mich nur gefragt, ob ich einen einfacheren Weg verpasst habe. – superartsy

Verwandte Themen