Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In .ini ohne Adminrechte speichern? (https://www.delphipraxis.net/131565-ini-ohne-adminrechte-speichern.html)

AlexII 26. Mär 2009 18:06


In .ini ohne Adminrechte speichern?
 
Kann ich irgendwie das Speichern der Einstellungen in eine .ini irgendwie umgehen bzw. gar nicht speichern wenn der User keine Adminrechte besitzt? Weil sonst die fehlermeldung kommt, dass man in die .ini nicht speicher kann und das Programm lässt sich nicht schließen.

Danke!

DeddyH 26. Mär 2009 18:09

Re: In .ini ohne Adminrechte speichern?
 
Wo liegt denn die Ini? Wenn Du die ins User-Verzeichnis packst, sollte sich das Problem möglicherweise von selbst erledigen.

jaenicke 26. Mär 2009 18:09

Re: In .ini ohne Adminrechte speichern?
 
Speichere einfach in den richtigen Ordner für Einstellungen:
http://www.delphi-library.de/viewtopic.php?p=548600

Optimal wäre, wenn du im eigenen Verzeichnis und in den Anwendungsdaten nach den Einstellungen suchst und wenn an beiden orten keine sind, den Benutzer fragst wo sie hin sollen. Dann ist eine portable Nutzung mit der selben Exe möglich.

fnhofm 26. Mär 2009 18:33

Re: In .ini ohne Adminrechte speichern?
 
Falls dein Programm über eine Installationsroutine verfügt
ist es auch möglich im Programmverzeichnis (Deiner Anwendung) das schreiben für User zu erlauben.

Christian Seehase 26. Mär 2009 18:38

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von fnhofm
Falls dein Programm über eine Installationsroutine verfügt
ist es auch möglich im Programmverzeichnis (Deiner Anwendung) das schreiben für User zu erlauben.

Es ist zwar in der Tat eine Möglichkeit, die würde ich aber nicht mal aus Spass in Erwägung ziehen ;-)

jaenicke 26. Mär 2009 18:39

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von fnhofm
Falls dein Programm über eine Installationsroutine verfügt
ist es auch möglich im Programmverzeichnis (Deiner Anwendung) das schreiben für User zu erlauben.

Wenn ein Programm das macht, dann würde ich es als Virus einstufen, da es absichtlich die Sicherheitseinstellungen des Rechners beeinträchtigt.

Apollonius 26. Mär 2009 18:43

Re: In .ini ohne Adminrechte speichern?
 
Wenn man es richtig macht, sollte das eigentlich keine Sicherheitslücke sein.

jaenicke 26. Mär 2009 18:50

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von Apollonius
Wenn man es richtig macht, sollte das eigentlich keine Sicherheitslücke sein.

Doch, weil ein Virus dann auch ohne Adminrechte ein Programm infizieren kann. Wenn ich das dann starte, dann starte ich den Virus erneut.

Wenn ein Programm unter c:\programme liegt, dann benötigt ein Virus Adminrechte um es zu verändern. Wenn ich also die Adminrechte nur an vertrauenswürdige Software gebe, dann kann ich auf einem korrekt konfigurierten System sicher sein, dass ein Virus nicht an meine Software herankommt.

Apollonius 26. Mär 2009 18:58

Re: In .ini ohne Adminrechte speichern?
 
Das ich die Rechte an Programmdateien nicht verändern darf, ist klar. Aber das spricht doch nicht dagegen, bei Konfigurationsdateien in einem festgelegten Rahmen zusätzliche Rechte zu vergeben.

AlexII 26. Mär 2009 19:11

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von DeddyH
Wo liegt denn die Ini? Wenn Du die ins User-Verzeichnis packst, sollte sich das Problem möglicherweise von selbst erledigen.

Das liegt in C:\Programme

Und wie packe ich das ins User-Verzeichnis? :gruebel:

DeddyH 26. Mär 2009 19:18

Re: In .ini ohne Adminrechte speichern?
 
Ich vermute einfach mal, dass Du die Ini ungefähr so erzeugst:
Delphi-Quellcode:
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Ininame.ini');
Versuch es also mal mit einem anderen Verzeichnis.
Delphi-Quellcode:
uses SHFolder;

function GetUserdataPath(out sPath: string): Boolean;
begin
  SetLength(sPath,MAX_PATH);
  SHGetFolderPath(0,CSIDL_APPDATA,0,0,PAnsiChar(sPath));
  SetLength(sPath,StrLen(PAnsiChar(sPath)));
  Result := Length(sPath) > 0;
  if Result then
    sPath := IncludeTrailingPathDelimiter(sPath);
end;

Meflin 26. Mär 2009 19:19

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von AlexII
Und wie packe ich das ins User-Verzeichnis? :gruebel:

Steht doch ausführlichst in dem Link aus Beitrag #3 :roll:

AlexII 26. Mär 2009 19:23

Re: In .ini ohne Adminrechte speichern?
 
Ich kann doch einfach das Programm für alle Benutzer installieren, ist doch viel leichter und man brauch das Programm nicht umschreiben?

Aber wie mache ich das im Inno Setup Compiler, kann mir jemand sagen?

Meflin 26. Mär 2009 19:24

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von AlexII
Ich kann doch einfach das Programm für alle Benutzer installieren, ist doch viel leichter und man brauch das Programm nicht umschreiben?
Aber wie mache ich das im Inno Setup Compiler, kann mir jemand sagen?

Quatsch. Dann wirds eher noch komplizierter, weil jeder Benutzer seinen eigene Konfigurationsdatei braucht. An deinem Problem löst das rein garnichts!

AlexII 26. Mär 2009 19:30

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von Meflin
Quatsch. Dann wirds eher noch komplizierter, weil jeder Benutzer seinen eigene Konfigurationsdatei braucht. An deinem Problem löst das rein garnichts!

Wieso nicht? :gruebel: Hab sowas schon mal gesehen. Also alles ok, denk nicht so kompliziert. Sag mir lieber wie der Code im Inno dafür lautet?

Meflin 26. Mär 2009 19:35

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von AlexII
Wieso nicht? :gruebel: Hab sowas schon mal gesehen. Also alles ok, denk nicht so kompliziert. Sag mir lieber wie der Code im Inno dafür lautet?

Was verleitet dich zu der Vermutung, das würde dein Problem lösen? Hat dein Programm deswegen mehr Rechte? Speichert dein Programm seine Einstellungen deswegen in einem anderen Verzeichnis?

Die Antwort ist: Nein.

AlexII 26. Mär 2009 19:42

Re: In .ini ohne Adminrechte speichern?
 
Post #3 bleibt dann die einzige Lösung? :gruebel:

Ich komme mit dieser aber nicht klar, gibt's vllt andere Lösungen?

mkinzler 26. Mär 2009 19:50

Re: In .ini ohne Adminrechte speichern?
 
Was verstehst du den genau nicht?

AlexII 26. Mär 2009 20:02

Re: In .ini ohne Adminrechte speichern?
 
Also ich hab das bei mir wie folgt:

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var ini :TIniFile;
begin
  Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
  try
    ComboBox1.ItemIndex := Ini.ReadInteger('Default', 'Channel', 0);
    TrackBar1.Position := Ini.ReadInteger('Default', 'Volume', 10);
    cbDirectConnection.Checked := Ini.ReadBool('Default', 'Proxy', True);
    ed_ProxyServer.Text := Ini.ReadString('Default', 'ProxyIP', '');
  finally
    ini.free;
  end;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
ini: TIniFile;
begin
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
try
   Ini.WriteInteger('Default', 'Channel', ComboBox1.ItemIndex);
   Ini.WriteInteger('Default', 'Volume', TrackBar1.Position);
   Ini.WriteBool('Default', 'Proxy', cbDirectConnection.Checked);
   Ini.WriteString('Default', 'ProxyIP', ed_ProxyServer.Text);
finally
   Ini.Free;
end;
Action:=caFree;
end;
end;
Wo und was soll ich aus dieser Lösung hier einbauen? Und außerdem ist da im Code irgendwas falsch. Abgespeicher wird die Datei in
Delphi-Quellcode:
C:\Dokumente und Einstellungen\Alex\Lokale Einstellungen\Anwendungsdaten\Sebastian Jänicke\AppDir Testprojekt
ausgelesen aber in
Delphi-Quellcode:
C:\Dokumente und Einstellungen\Alex\Lokale Einstellungen\Anwendungsdaten
Diese Lösung muss man noch korrigieren und wenn ich sie nicht verstehe und nicht korrigieren kann, kann auch nicht weiter kommen.
Verzeiht, ich gebe mir richtig mühe... :pale:

Luckie 26. Mär 2009 20:05

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von Apollonius
Wenn man es richtig macht, sollte das eigentlich keine Sicherheitslücke sein.

Dann aber viel Spass, wenn mehrere Benutzer das Programm benutzen.

DeddyH 26. Mär 2009 20:14

Re: In .ini ohne Adminrechte speichern?
 
Schau Dir die Konstanten in dem verlinkten Artikel nochmal genau an.

mkinzler 26. Mär 2009 20:15

Re: In .ini ohne Adminrechte speichern?
 
Statt dem Verzeichnis de Exe (Application.ExeName bzw. ParamStr(0) halt Special Folder einsetzen
http://www.delphipraxis.net/internal...t.php?t=123453

Meflin 26. Mär 2009 20:27

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von Luckie
Dann aber viel Spass, wenn mehrere Benutzer das Programm benutzen.

Was haben mehrere Benutzer damit zu tun? Es soll durchaus auch Einstellungen geben, die für alle Benutzer gleich sien sollen :gruebel: Ob die jetzt in ProgramData oder in einer extra berechtigten Datei im Programmverzeichnis gespeichert werden ist doch total egal.

AlexII 26. Mär 2009 20:32

Re: In .ini ohne Adminrechte speichern?
 
Etwa so? :gruebel:

Delphi-Quellcode:
function GetSpecialFolder(Folder: Integer): String;
begin
  SetLength(Result,MAX_PATH);
  If SHGetSpecialFolderPath(0, PChar(Result), Folder, false)
    then SetLength(Result,StrLen(PChar(Result)))
    else Result:='';
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var ini: TIniFile;
    dir: String;
begin
Ini := TIniFile.Create(GetSpecialFolder(dir) + 'config.ini');
try
   Ini.WriteInteger('Default', 'Channel', ComboBox1.ItemIndex);
   Ini.WriteInteger('Default', 'Volume', TrackBar1.Position);
   Ini.WriteBool('Default', 'Proxy', cbDirectConnection.Checked);
   Ini.WriteString('Default', 'ProxyIP', ed_ProxyServer.Text);
finally
   Ini.Free;
end;
Action:=caFree;
end;
end;

mkinzler 26. Mär 2009 20:34

Re: In .ini ohne Adminrechte speichern?
 
Nein, da di Typen nicht stimmen, zudem solltest du die Beiträge/Tutorials, die dir hier gepostet werden richtig durchlesen

AlexII 26. Mär 2009 20:45

Re: In .ini ohne Adminrechte speichern?
 
Und wie kann ich das Speicher in die .ini umgehen falls User keine Rechte zum speichern hat? Werde dann auf das Speichern verzichten, Hauptsache man kann das Programm schließen.

Geht das so ähnlich wie folg:

Delphi-Quellcode:
Speichern
if ok then
begin
Gespeichert
Programm schließen
end else
    begin
    Nicht gespeichert, da keine Rechte
    Programm schließen
    end;

mkinzler 26. Mär 2009 20:51

Re: In .ini ohne Adminrechte speichern?
 
Wenn du einen passenden Pfad wählst, hat der User auch Schreibrechte.

AlexII 26. Mär 2009 21:09

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von DeddyH
Ich vermute einfach mal, dass Du die Ini ungefähr so erzeugst:
Delphi-Quellcode:
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Ininame.ini');
Versuch es also mal mit einem anderen Verzeichnis.
Delphi-Quellcode:
uses SHFolder;

function GetUserdataPath(out sPath: string): Boolean;
begin
  SetLength(sPath,MAX_PATH);
  SHGetFolderPath(0,CSIDL_APPDATA,0,0,PAnsiChar(sPath));
  SetLength(sPath,StrLen(PAnsiChar(sPath)));
  Result := Length(sPath) > 0;
  if Result then
    sPath := IncludeTrailingPathDelimiter(sPath);
end;

Etwa so:

Delphi-Quellcode:
var dir String;

Ini := TIniFile.Create(ExtractFilePath(GetUserdataPath(dir)) + 'Ininame.ini');

mkinzler 26. Mär 2009 21:13

Re: In .ini ohne Adminrechte speichern?
 
Nein, weil ein out-Parameter verwendet wird.
Delphi-Quellcode:
if GetUserdataPath(dir) then
    Ini := TIniFile.Create(dir + ' \Ininame.ini');

AlexII 26. Mär 2009 21:19

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von mkinzler
Nein, weil ein out-Parameter verwendet wird.
Delphi-Quellcode:
if GetUserdataPath(dir) then
    Ini := TIniFile.Create(dir + ' \Ininame.ini');

Also so?
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var ini: TIniFile;
    dir: String;
begin
if GetUserdataPath(dir) then
begin
Ini := TIniFile.Create(dir + 'config.ini');
try
   Ini.WriteInteger('Default', 'Channel', ComboBox1.ItemIndex);
   Ini.WriteInteger('Default', 'Volume', TrackBar1.Position);
   Ini.WriteBool('Default', 'Proxy', cbDirectConnection.Checked);
   Ini.WriteString('Default', 'ProxyIP', ed_ProxyServer.Text);
finally
   Ini.Free;
end;
Action:=caFree;
end;
end else ???? //eine Fehlermeldung einbauen und fertig? Oder Programm schließen? Sonst kriegt man es nicht zu
end;

mkinzler 26. Mär 2009 21:21

Re: In .ini ohne Adminrechte speichern?
 
Probieren geht über Studieren.

DeddyH 26. Mär 2009 21:22

Re: In .ini ohne Adminrechte speichern?
 
So würdest Du ja direkt ins Anwendungsdatenverzeichnis speichern. Das ist aber so nicht gedacht, Du solltest dort ein Unterverzeichnis für Dein Programm erstellen und das dann nutzen.

AlexII 26. Mär 2009 21:27

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von DeddyH
So würdest Du ja direkt ins Anwendungsdatenverzeichnis speichern. Das ist aber so nicht gedacht, Du solltest dort ein Unterverzeichnis für Dein Programm erstellen und das dann nutzen.

Wenigstens so :dancer:

DeddyH 26. Mär 2009 21:33

Re: In .ini ohne Adminrechte speichern?
 
Mach doch mal eine Kommandozeile auf (Start - Ausführen - cmd) und gib dort ein
Code:
dir "%APPDATA%"
Vermutlich wirst Du dort nur Verzeichnisse und keine Dateien finden.

AlexII 26. Mär 2009 21:34

Re: In .ini ohne Adminrechte speichern?
 
Irgendwie wird da noch nix und nirgendwo gespeichert :gruebel: Oh man... :wall:

AlexII 26. Mär 2009 21:36

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von DeddyH
Mach doch mal eine Kommandozeile auf (Start - Ausführen - cmd) und gib dort ein
Code:
dir "%APPDATA%"
Vermutlich wirst Du dort nur Verzeichnisse und keine Dateien finden.

Doch die config.ini hat er gefungen :thumb: Aber wieso finden die Suche sie nicht?

DeddyH 26. Mär 2009 21:37

Re: In .ini ohne Adminrechte speichern?
 
Ich weiß ja nicht, wie und wo Du suchst.

AlexII 26. Mär 2009 21:39

Re: In .ini ohne Adminrechte speichern?
 
Ok es klappt jetzt alles :thumb:
Und wird das auch unter Vista gehen, was meinst du?

DeddyH 26. Mär 2009 21:41

Re: In .ini ohne Adminrechte speichern?
 
Eigentlich ist das ja von Microsoft genau so vorgesehen, sollte also auch unter Vista funktionieren.

jaenicke 26. Mär 2009 21:43

Re: In .ini ohne Adminrechte speichern?
 
Zitat:

Zitat von AlexII
Ok es klappt jetzt alles :thumb:
Und wird das auch unter Vista gehen, was meinst du?

Das sollte auch unter Vista normal klappen. In den Anwendungsdaten sollten jedenfalls der Ordnung halber Unterverzeichnisse benutzt werden, das wurde ja schon gesagt. Wie wäre es so, auch mal richtig formatiert:
Delphi-Quellcode:
uses
  ActiveX, ShlObj, IniFiles;

const
  AppDataRootDir = '\AlexII';
  AppDataProjectDir = '\Dein Projektname';
  CSIDL_LOCAL_APPDATA = $001c;

function GetSpecialFolder(aFolder: Integer): String;
var
  pIdL: PItemIDList;
  Path: array [0..Max_Path] of Char;
  Allocator: IMalloc;
begin
  // ItemIdList für den Ordner holen
  SHGetSpecialFolderLocation(0, aFolder, pIdL);
  // ItemIdList in String umwandeln lassen
  SHGetPathFromIDList(pIDL, Path);
  // Speicher wieder freigeben
  if Succeeded(SHGetMalloc (Allocator)) then
    Allocator.Free(pIdL);
  Result := Path;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  Ini: TIniFile;
  UserAppDataDir: String;
begin
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\config.ini') then
  begin
    Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\config.ini');
    try
      ComboBox1.ItemIndex := Ini.ReadInteger('Default', 'Channel', 0);
      TrackBar1.Position := Ini.ReadInteger('Default', 'Volume', 10);
      cbDirectConnection.Checked := Ini.ReadBool('Default', 'Proxy', True);
      ed_ProxyServer.Text := Ini.ReadString('Default', 'ProxyIP', '');
    finally
      ini.free;
    end;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Ini: TIniFile;
  UserAppDataDir: String;
begin
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir);
  Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\config.ini');
  try
    Ini.WriteInteger('Default', 'Channel', ComboBox1.ItemIndex);
    Ini.WriteInteger('Default', 'Volume', TrackBar1.Position);
    Ini.WriteBool('Default', 'Proxy', cbDirectConnection.Checked);
    Ini.WriteString('Default', 'ProxyIP', ed_ProxyServer.Text);
  finally
    Ini.Free;
  end;
  Action := caFree; // Bringt nur etwas, wenn es nicht im Hauptformular steht
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
Seite 1 von 2  1 2      

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