Benutzer mit den meisten Antworten
Globale Konfigurationsdatei

Frage
-
Ich habe ein kleines Problem oder ein Denkfehler
Wenn ich .net Konform entwickeln will, sollte man die App.Config benutzen um Einstellungen für ein Programm abzulegen. Wenn ich den Parameter als "Anwendungsparameter" einstelle kann ich Ihn nicht verändern sondern nur lesen. Aber der Konfig-Zweig liegt im Programm-Hauptverzeichnis also von jedem User lesbar. Wenn ich den Parameter als "Benutzerparameter" einstelle kann ich Ihn verändern aber dann liegt er im "User\appdata\" Verzeichnis wo ein anderer Benutzer nicht so einfach lesen kann.
Wenn ich die Registry benutze ist es das selbe "HKLU" habe ich schreib und lese Rechte "HKLM" nur lese Rechte (außer ich mache einen Stunt und starte vorher einen Prozess der mit "Admin"-Rechten ausgeführt wird.)
In das Programmverzeichnis oder auf die Systempartition sollte man ab Win-Vista auch keine Dateien ablegen, da nicht gewähleistet ist das ich dort Schreibrechte habe.
Gibt es eine Möglichkeit dem Programm vorher zu sagen das die globale Konfig-Datei immer unter "AllUser\AppData" zu finden ist und die Lokale Konfig-Datei kann dann von mir aus im "User\AppData" liegt.
Bei einem TS-Server mit 50+ User ist es müssig die Globalen Einstellung unter den verschiedenen Benutzern abzugleichen, da jeder Benutzer es ja ändern könnte, so gar Zeitgleich.
Globale Konfig:
Beinhaltet Pfad zu den Datenbanken die ich auswerten will + Verbindungsinformationen (nicht SQL). Die Pfade sind für jeden Benutzer gleich und müssten theoretisch nur einmal, nach der Installation angepasst werden.Lokale Konfig:
Beinhaltet die Zahlen und Werte des Benutzers. Die sind für jeden Benutzer unterschiedlichGruß Thomas
Antworten
-
Hallo an alle die mir zurück geschrieben haben.
Das Problem ist zwar nicht so gelöst wie ich es mir erhofft hatte, aber es sind Lösungen dabei die mir in Zukunft weiterhelfen werden (Installer Projekt).
Für mein jetziges Projekt werde ich mir eine "exe" entwickeln, deren Hauptaufgabe besteht die globale Konfiguration zu erstellen und verwalten in dem ich diese "exe" als neuen Prozess mit Admin-Rechten starte. Ist zwar keine schöne Lösung aber sie funktioniert erstmal.
Dank an alle für die Tips
- Als Antwort markiert tommytom73 Montag, 2. August 2010 14:18
Alle Antworten
-
Hallo Thomas,
Ich würde Einstellungen, die alle Benutzer was angehen, zentral, in einer Datenbank ablegen. Beim Start der Anwendung überprüft Deine Anwendung diese Einstellungen und überschreibt bei abweichenden Werten die Benutzereinstellung (user.config) mit den aktuellen Werten.
Es gibt auch andere Wege (z.B. eigener SettingsProvider), aber der Aufwand ist größer.Creating a Custom Settings Provider:
http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspxGruss
Marcel -
Globale Konfig:
Beinhaltet Pfad zu den Datenbanken die ich auswerten will + Verbindungsinformationen (nicht SQL). Die Pfade sind für jeden Benutzer gleich und müssten theoretisch nur einmal, nach der Installation angepasst werden.Und genau das kann die Installationsroutine machen, die mit Admin-Rechten läuft und die einmal zu tätigenden Einstellungen mit ins Programmverzeichnis schreibt.--
Viele Gruesse
Peter -
Die Idee hatte ich mir auch schon überlegt. Aber ich fand es ein wenig überproportional wegen 4-7 Parametern gleich eine Datenbank ins Spiel zu bringen.
Die Settings Provider hatte ich schon mal am Wickel aber ich fand die ein wenig unübersichtlich aber warscheinlich kann es nur so gehen.
Gruß Thomas
-
Hallo Peter
Welche Install-Routine meinst du ? Die mitgelieferte von VS2005 konnte sowas meines Wissens nicht. Die von VS2010 habe ich mir noch nicht angeschaut.
Mein Workflow beim ersten Start der App sieht so aus.
Frage nach Versionsart
|
----> Ja
| |
| ----->Frage nach Root Verzeichnis der DB Anwendung (prüfen ob Native DLL(1) vorhanden ist.
| |
| ----->Frage nach DB Verzeichnis der DB Anwendung
| |
| -----> Native DLL(1) laden und schauen ob Verbindung aufgebaut werden kann
| |
| ------> (Ja) - Einstellung speichern (alles wird gut)
| |
| ------> (Nein) - Anwendung beenden (muss später nochmal eingegeben werden)
|
----> Nein
|
----> Frage nach Root Verzeichnis der DB Anwendung (prüfen ob Native DLL(2) vorhanden ist.
|
----> Frage nach DB Verzeichnis
|
----> Frage nach Server-Name
|
----> Frage nach Server-Port
|
----> Frage nach User-Name / Password
|
----> Native DLL(2) laden und schauen ob Verbindung aufgebaut werden kann
|
------> (Ja) - Einstellung speichern (alles wird gut)
|
------> (Nein) - Anwendung beenden (muss später nochmal eingegeben werden)Und nur diese 3-6 Parameter muss ich für alle User lesbar und veränderbar abspeichern können.
Ideen bisher:
1. Ini-Datei (ist nicht mehr konform und sollte nicht mehr verwendet werden)
2. In AllUser selber Verzeichnisse anlegen und Daten ablegen (weiß aber nicht genau was da für Probleme kommen können Rechte/Sicherheit/UAC)
3. Datenbank (Wo aber ablegen ?)
4. Registry (HKLM kann nur als Admin beschrieben werden)
5. Jeder User hat seine eigene Einstellung und muss Sie beim ersten Start einmal anlegen (ist bei TS-Server bei 40-60 Usern ein Geduldsspiel)Ich finde es halt schade das die Benutzereinstellungen der App.Config schön unter dem entsprechenen "User\Appdata\" abglegt werden und die Anwendungseinstellungen nicht unter "AllUser\Appdata"
Wenn du noch eine Idee hast wie man das Elegant lösen kann wäre ich dir dankbar. Denn es gibt Admins auf dieser Welt die schließen einen Server so ab, das sie selbst nicht mehr wissen, was sie alles blockiert haben.
Gruß Thomas
-
Hallo Thomas,
Wenn ich .net Konform entwickeln will, sollte man die App.Config benutzen um Einstellungen für ein Programm abzulegen. Wenn ich den Parameter als "Anwendungsparameter" einstelle kann ich Ihn nicht verändern sondern nur lesen.
Während der Installation, die üblicherweise als Admin durchgeführt wird, kannst Du die app.config auch beschreiben. Dieses müsstest Du allerdings als CustomAction selber programmieren, etwas vorgekautes gibt es da nicht beim Setup.
Installer Class
http://msdn.microsoft.com/en-us/library/system.configuration.install.installer.aspx
Halte ich für Dein Szenario auch die sinnvollste Vorgehensweise, da Du wohl bei einer TS Umgebung nicht möchtest, dass Dir jeder User die globale Konfiguration schreiben soll.
In das Programmverzeichnis oder auf die Systempartition sollte man ab Win-Vista auch keine Dateien ablegen, da nicht gewähleistet ist das ich dort Schreibrechte habe.
Das ist nicht erst seit Vista so, sondern das "Problem" existiert schon seit NT 3.51.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thomas,
Die Idee [mit der Datenbank - u.A.] hatte ich mir auch schon überlegt. Aber ich fand es ein wenig überproportional wegen 4-7 Parametern gleich eine Datenbank ins Spiel zu bringen.
Ja, das lohnt sich meist nur bei dynamischen Einstellungen, die oft geändert werden. Aber spätestens wenn Dir dann die Systemadministratoren auf die Pelle rücken, ist es unausweichlich vom .NET-Muster abzurücken. Man kann sicherlich die App.config verteilen, habe ich schon in allen möglichen Variationen erlebt, aber in den heterogenen Systemlandschaften von heute klappt das of nur in 99% der Fälle. Das große Geschrei ist dann wegen der 3-4 Rechner in der Chefetage, wo irgenwelche Policy nicht "gezogen" hat und irgend ein vergessenes Detail verhindert hat, dass die verteilte App.config übernommen wurde. Ich lass mal die Probleme mit dem Verschlüsseln der ConnectionString-Section außen vor.
Gruß
Marcel -
Hallo an alle die mir zurück geschrieben haben.
Das Problem ist zwar nicht so gelöst wie ich es mir erhofft hatte, aber es sind Lösungen dabei die mir in Zukunft weiterhelfen werden (Installer Projekt).
Für mein jetziges Projekt werde ich mir eine "exe" entwickeln, deren Hauptaufgabe besteht die globale Konfiguration zu erstellen und verwalten in dem ich diese "exe" als neuen Prozess mit Admin-Rechten starte. Ist zwar keine schöne Lösung aber sie funktioniert erstmal.
Dank an alle für die Tips
- Als Antwort markiert tommytom73 Montag, 2. August 2010 14:18