Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi INI-Datei von windows nach ProgramData verschieben. (https://www.delphipraxis.net/187441-ini-datei-von-windows-nach-programdata-verschieben.html)

bernau 30. Nov 2015 13:18

INI-Datei von windows nach ProgramData verschieben.
 
Alte Software von mir schreibt seit Win95 eine Ini-Datei im Windows-Verzeichnis. Mit Win7 und neuer wird die INI-Datei dann in's Virtual Store geschrieben.

Ich will von den Altlasten weg. Möchte also die INI-Dateien nach ProgramData verschieben, da wo sie hingehören. Habe mir gedacht, daß ich das Programm so erweitere, daß wenn es gestartet wird, ich die INI-Dateien einfach verschiebe. Geht natürlich nicht, da das Programm ja Adminrechte braucht, damit die INI-Datei aus dem Windows-Verzeichnis entfernt werden kann. Wenn ich das Programm mit Adminrechten starten, kann ich die Ini-Datei verschieben, kopieren, löschen etc.

Mein Dilemma ist aber, daß die verschobene INI-Datei auch im ProgramData-Verzeichnis Admin-Rechte braucht, damit diese Verändert werden kann. Wenn ich das Programm also neu starte (ohne Adminrechte), kann es dort in die INI-Datei nichts mehr hinein schreiben.

Wie habt Ihr das mit eueren alten INI-Dateien gehandhabt.

Lemmy 30. Nov 2015 13:23

AW: INI-Datei von windows nach ProgramData verschieben.
 
dann lass die Ini-Datei doch in Windows-Verzeichnis. Starte die Anwendung mit normalen Rechten. Fehlt die Ini-Datei am neuen Platz, dann lad die IniDatei vom alten Platz und mach denn einfach in INi.SaveFile() im neuen Verzeichnis und gut ist...

bernau 30. Nov 2015 13:28

AW: INI-Datei von windows nach ProgramData verschieben.
 
Ich möchte aber vermeiden, daß zig verschiedene Versionen der INI-Datei verstreut auf dem Rechner rumliegen. Sauberer wäre das Löschen.

HolgerX 30. Nov 2015 13:30

AW: INI-Datei von windows nach ProgramData verschieben.
 
Dann starte mit RunAs ein Delete-Script als Admin.

Beispiele findest Du hier im Form..

Dann kannst Du deine App ganz normal starten und benötigst die erweiterten Rechte ja nur zum Löschen ..;)

Lemmy 30. Nov 2015 13:31

AW: INI-Datei von windows nach ProgramData verschieben.
 
dann starte eine kleine batch die das Löschen übernimmt eben mit einer Anforderung nach höheren Rechten. Musst halt dem Anwender erklären was passiert - und sicher stellen, dass die richtige (und nur die) ini-Datei gelöscht wird. Daher würde ich her gehen und die Ini-Datei schlicht liegen lassen. Beim Deinstall wird die entfernt - alles andere ist Kosmetik. Wäre zwar schön, aber ich persönlich würde das Risiko, dass etwas schief läuft höher bewerten als den Gewinn....

Grüße

bra 30. Nov 2015 13:50

AW: INI-Datei von windows nach ProgramData verschieben.
 
Wäre es nicht sinnvoller, das ins AppData des Benutzers zu schreiben? ProgramData ist eher sinnvoll für Dienste und braucht ggf. Admin-Rechte.
Ist natürlich abhängig von deiner Anwendung, was du brauchst.

Sir Rufo 30. Nov 2015 14:54

AW: INI-Datei von windows nach ProgramData verschieben.
 
Die Einstellungen für die Anwendung liegen in ProgramData\{Company}\{ApplicationName}.
Die Benutzer-Einstellungen für die Anwendung liegen in AppData\{Company}\{ApplicationName}.

Um die effektiven Einstellungen zu laden, werden die Einstellungen aus ProgramData\{Company}\{ApplicationName} und AppData\{Company}\{ApplicationName} gelesen.

Ändert ein Benutzer seine Einstellungen, dann wird das in AppData\{Company}\{ApplicationName} gespeichert.

Läuft die Anwendung mit Administrator-Rechten, dann kann man zusätzlich anbieten, die Einstellungen für ProgramData\{Company}\{ApplicationName} zu bearbeiten.

Um die alten Einstellungen zu migrieren, beauftragt man das Setup-Programm zum Kopieren der Einstellungen aus dem Windows-Verzeichnis in ProgramData\{Company}\{ApplicationName}.

Beim Starten der Anwendung prüft man, ob es schon eine Einstellungs-Datei unter AppData\{Company}\{ApplicationName} gibt. Wenn nicht, dann lädt man die Einstellungen auf die alte Art und Weise und schreibt diese in AppData\{Company}\{ApplicationName}.

bernau 30. Nov 2015 16:10

AW: INI-Datei von windows nach ProgramData verschieben.
 
Danke für eure Hinweise. Ich lasse mir mal durch den Kopf gehen, was die beste Lösung ist.

bernau 30. Nov 2015 18:18

AW: INI-Datei von windows nach ProgramData verschieben.
 
Tja. Das war für mich mal wieder ein Griff in den Lokus.

Ich habe folgendes aus dem Dokwiki für die Funktion System.IOUtils.TPath.GetPublicPath

Zitat:

Returns the path to the directory where you can store application data that can be shared with other applications.
Note: In desktop applications, "shared" means "shared between different users". In mobile applications, "shared" means "shared between different applications".
Als Ergebnis bekomme ich den Pfad c:\ProgramData

Das bedeutet für mich, ich habe einen zentralen Punkt, in dem ich Programmeinstellungen speichere. Ich möchte es so haben, daß gewisse Einstellungen von jedem Benutzer geschrieben werden können. Wäre also der richtige Ort. Habe ich gedacht.......

Habe jetzt mal etwas gespielt und einen neuen Benutzer in Windows angelegt. Das Programm hatte ich vorher schon unter meinem Standardbenutzer gestartet und somit schon eine INI-Datei nach c:\ProgramData\blibblab geschrieben. Mit dem neuen Benutzer kann ich zwar lesen, habe aber keine Schreibberechtigung auf diese Datei, die mit dem gleichen Programm, aber unter einem anderen Benutzer geschrieben wurde. Habe ich wohl falsch gedacht.

Ich welches Verzeichnis kann jedes Programm schreiben, ohne daß ich auf den angemeldeten Benutzer Rücksicht nehmen muss?

Uwe Raabe 30. Nov 2015 18:32

AW: INI-Datei von windows nach ProgramData verschieben.
 
Ich kann jetzt die Quelle nicht mehr nennen, aber ich meine, ein App-spezifisches Unterverzeichnis von ProgramData ist genau der richtige Ort. Dieser sollte allerdings vom Setup-Programm angelegt und mit den erforderlichen Rechten versehen werden. Bei mir ist das schon ein Standard-Schnipsel im InnoSetup-Skript.

haentschman 30. Nov 2015 18:38

AW: INI-Datei von windows nach ProgramData verschieben.
 
@Uwe
Zitat:

Bei mir ist das schon ein Standard-Schnipsel im InnoSetup-Skript.
...just stehe ich auch vor diesem Problem. :P Kannst du mir das Denken erleichtern und den Schnipsel veröffentlichen? Ich muß beim Inno schon genug wieder neu lernen... :roll:

Danke

bernau 30. Nov 2015 18:43

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von haentschman (Beitrag 1322985)
@Uwe
Zitat:

Bei mir ist das schon ein Standard-Schnipsel im InnoSetup-Skript.
...just stehe ich auch vor diesem Problem. :P Kannst du mir das Denken erleichtern und den Schnipsel veröffentlichen? Ich muß beim Inno schon genug wieder neu lernen... :roll:

Danke

Ähhmmm. Mir auch.

Oder einfach den Schnipse hier anhängen.:party:

Perlsau 30. Nov 2015 18:48

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von bernau (Beitrag 1322982)
Ich welches Verzeichnis kann jedes Programm schreiben, ohne daß ich auf den angemeldeten Benutzer Rücksicht nehmen muss?

Meiner Kenntnis nach in C:\Users\All Users.

bernau 30. Nov 2015 19:02

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von Perlsau (Beitrag 1322988)
Zitat:

Zitat von bernau (Beitrag 1322982)
Ich welches Verzeichnis kann jedes Programm schreiben, ohne daß ich auf den angemeldeten Benutzer Rücksicht nehmen muss?

Meiner Kenntnis nach in C:\Users\All Users.

Aber das gibt es ja nicht mehr wirklich unter Win7/8

hathor 30. Nov 2015 19:30

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von bernau (Beitrag 1322991)
Zitat:

Zitat von Perlsau (Beitrag 1322988)
Meiner Kenntnis nach in C:\Users\All Users.

Aber das gibt es ja nicht mehr wirklich unter Win7/8

Natürlich gibt es das noch:
C:\Users\All Users ist das Gleiche wie C:\Benutzer\All Users
Physikalisch ist es in C:\ProgramData

Zugriffsrechte Beispiel:
C:\ProgramData\MyProgram\MyProgram.ini
Zugriff: System, Administratoren,
d.h. das Programm, das das File erstellt hat UND Administratoren haben Vollzugriff, andere haben NUR Lesezugriff.

Uwe Raabe 30. Nov 2015 19:57

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von bernau (Beitrag 1322987)
Oder einfach den Schnipse hier anhängen.:party:

Kein Problem. Die beiden Dirs-Einträge sorgen für die Schreibrechte, während der Code für die synchrone Namensgebung der Verzeichnisse zuständig ist. Die Vorgabe des Zielverzeichnisses ist bei meinen Setups nicht änderbar, deswegen funktioniert hier das ersetzen von {pf} in {commondocs} bzw. {commonappdata} auch problemlos. Bei wahlfreien Zielverzeichnissen kann man den Code aber auch entsprechend anpassen und die jeweiligen Subpfade direkt hinschreiben oder aus anderen Quellen zusammensetzen.

Delphi-Quellcode:
[Dirs]
Name: {code:AppDataFolder}\; Permissions: users-modify
Name: {code:DataFolder}\; Permissions: users-modify
und

Delphi-Quellcode:
[Code]
function DataFolder(Param: String): String;
begin
  result := WizardDirValue;
  StringChangeEx(result, ExpandConstant('{pf}'), ExpandConstant('{commondocs}'), true);
end;

function AppDataFolder(Param: String): String;
begin
  result := WizardDirValue;
  StringChangeEx(result, ExpandConstant('{pf}'), ExpandConstant('{commonappdata}'), true);
end;

Luckie 30. Nov 2015 20:10

AW: INI-Datei von windows nach ProgramData verschieben.
 
In C:\Users\All Users überschreiben sich die Benutzer aber gegenseitig ihre Einstellungen. Meiner meinung nach gehören Einstellungen entweder in die Registry in den Benutzerspezifischen Zwig oder als Datei nach C:\Users\[Benutzername]\AppData\Roaming\[Programmname]

Perlsau 30. Nov 2015 21:51

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von Luckie (Beitrag 1322997)
In C:\Users\All Users überschreiben sich die Benutzer aber gegenseitig ihre Einstellungen. Meiner meinung nach gehören Einstellungen entweder in die Registry in den Benutzerspezifischen Zwig oder als Datei nach C:\Users\[Benutzername]\AppData\Roaming\[Programmname]

Sehe ich auch so. :thumb: Das war aber nicht die Frage, auf die ich geantwortet hatte, denn die lautete: In welches Verzeichnis kann jedes Programm schreiben, ohne daß ich auf den angemeldeten Benutzer Rücksicht nehmen muss?

Handelt es sich um Multiuser-Datenbank-Clients – Programme also, die ihr Zeugs in einer Datenbank ablegen und am selben Rechner mehrere Benutzer zu verwalten haben oder von mehreren Rechnern aus auf einen DB-Server zugreifen –, ziehe ich es mittlerweile vor, auch die benutzerspezifischen Daten in der jeweiligen Datenbank (bei mir fast ausnahmslos Firebird) zu verwalten. Das hat zum einen den Vorteil, daß diese Programmeinstellungen und Benutzerdaten nicht verloren gehen, wenn man auf einen anderen Rechner umziehen muß, und zum anderen, daß alle Benutzer entsprechende Schreib- und Leserechte in der Datenbank besitzen. Man kann dann immer noch trusted connection, wie man sie vom SQL-Server kennt, einsetzen, um dem Benutzer die zweite Anmeldung in der Anwendung zu ersparen. Damit dann jeder Benutzer seine eigenen Einstellungen ohne Einschränkungen und über Betriebssystemgrenzen hinweg parat, selbst bei einer Portierung der Anwendung z.B. auf Linux oder Mac-OS, weil man dann noch immer dieselbe Datenbank verwenden kann, wenn man ein entsprechendes DBMS verwendet, das auch für andere OS' verfügbar ist.

Uwe Raabe 30. Nov 2015 22:12

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von Luckie (Beitrag 1322997)
In C:\Users\All Users überschreiben sich die Benutzer aber gegenseitig ihre Einstellungen. Meiner meinung nach gehören Einstellungen entweder in die Registry in den Benutzerspezifischen Zwig oder als Datei nach C:\Users\[Benutzername]\AppData\Roaming\[Programmname]

Das war aber gar nicht gefragt.

bernau 30. Nov 2015 22:14

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von Luckie (Beitrag 1322997)
In C:\Users\All Users überschreiben sich die Benutzer aber gegenseitig ihre Einstellungen. Meiner meinung nach gehören Einstellungen entweder in die Registry in den Benutzerspezifischen Zwig oder als Datei nach C:\Users\[Benutzername]\AppData\Roaming\[Programmname]

Es gibt doch auch Daten, Parameter oder Sonstiges, die nicht benutzerspezifisch sind, sondern die nur für die Lauffähigkeit des Programms notwendig sind, egal welcher Benutzer grade angemeldet ist. Die gehören m.M. nach in das Verzeichnis c:\Programdata\xxx und dort muss dann das "Programm" schreiben können.

Beispiel: Eine Lizensdatei, welche alle 7 Tage aktualisiert wird. Egal welcher Benutzer angemeldet ist. Die Datei muss vom Programm geschrieben werden können.

bernau 30. Nov 2015 22:16

AW: INI-Datei von windows nach ProgramData verschieben.
 
@Uwe Raabe: Danke für den Schnipsel. Hilft schon mal sehr weiter.

p80286 1. Dez 2015 08:34

AW: INI-Datei von windows nach ProgramData verschieben.
 
Zitat:

Zitat von Luckie (Beitrag 1322997)
In C:\Users\All Users überschreiben sich die Benutzer aber gegenseitig ihre Einstellungen.

Das kann ja auch beabsichtigt sein!
Ebenso spricht nichts dagegen mit zwei Dateien zu arbeiten, einer für alle Benutzer {allUsers} und einer für die spezifischen Einstellungen {benutzer}.

Was den Gebrauch der Registry angeht, ist ODBC ein schönes Beispiel für System/Benutzer-Einstellungen.

Zitat:

Zitat von hathor (Beitrag 1322994)
Zugriffsrechte Beispiel:
C:\ProgramData\MyProgram\MyProgram.ini
Zugriff: System, Administratoren,
d.h. das Programm, das das File erstellt hat UND Administratoren haben Vollzugriff, andere haben NUR Lesezugriff.

Ggf. hilft hier ein Blick in die Dateieigenschaften->Sicherheit, da u.U. der Admin da etwas "gedreht" hat. Für den Normalbetrieb ist der Vollzugriff nicht nötig, da reicht Schreibend und Lesend.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz