![]() |
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! |
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.
|
Re: In .ini ohne Adminrechte speichern?
Speichere einfach in den richtigen Ordner für Einstellungen:
![]() 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. |
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. |
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Wenn man es richtig macht, sollte das eigentlich keine Sicherheitslücke sein.
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
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. |
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.
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
Und wie packe ich das ins User-Verzeichnis? :gruebel: |
Re: In .ini ohne Adminrechte speichern?
Ich vermute einfach mal, dass Du die Ini ungefähr so erzeugst:
Delphi-Quellcode:
Versuch es also mal mit einem anderen Verzeichnis.
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Ininame.ini');
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; |
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
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? |
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
Die Antwort ist: Nein. |
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? |
Re: In .ini ohne Adminrechte speichern?
Was verstehst du den genau nicht?
|
Re: In .ini ohne Adminrechte speichern?
Also ich hab das bei mir wie folgt:
Delphi-Quellcode:
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
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;
Delphi-Quellcode:
ausgelesen aber in
C:\Dokumente und Einstellungen\Alex\Lokale Einstellungen\Anwendungsdaten\Sebastian Jänicke\AppDir Testprojekt
Delphi-Quellcode:
Diese Lösung muss man noch korrigieren und wenn ich sie nicht verstehe und nicht korrigieren kann, kann auch nicht weiter kommen.
C:\Dokumente und Einstellungen\Alex\Lokale Einstellungen\Anwendungsdaten
Verzeiht, ich gebe mir richtig mühe... :pale: |
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Schau Dir die Konstanten in dem verlinkten Artikel nochmal genau an.
|
Re: In .ini ohne Adminrechte speichern?
Statt dem Verzeichnis de Exe (Application.ExeName bzw. ParamStr(0) halt Special Folder einsetzen
![]() |
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
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; |
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
|
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; |
Re: In .ini ohne Adminrechte speichern?
Wenn du einen passenden Pfad wählst, hat der User auch Schreibrechte.
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
Delphi-Quellcode:
var dir String;
Ini := TIniFile.Create(ExtractFilePath(GetUserdataPath(dir)) + 'Ininame.ini'); |
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'); |
Re: In .ini ohne Adminrechte speichern?
Zitat:
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; |
Re: In .ini ohne Adminrechte speichern?
Probieren geht über Studieren.
|
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.
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Mach doch mal eine Kommandozeile auf (Start - Ausführen - cmd) und gib dort ein
Code:
Vermutlich wirst Du dort nur Verzeichnisse und keine Dateien finden.
dir "%APPDATA%"
|
Re: In .ini ohne Adminrechte speichern?
Irgendwie wird da noch nix und nirgendwo gespeichert :gruebel: Oh man... :wall:
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
|
Re: In .ini ohne Adminrechte speichern?
Ich weiß ja nicht, wie und wo Du suchst.
|
Re: In .ini ohne Adminrechte speichern?
Ok es klappt jetzt alles :thumb:
Und wird das auch unter Vista gehen, was meinst du? |
Re: In .ini ohne Adminrechte speichern?
Eigentlich ist das ja von Microsoft genau so vorgesehen, sollte also auch unter Vista funktionieren.
|
Re: In .ini ohne Adminrechte speichern?
Zitat:
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 00:11 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-2025 by Thomas Breitkreuz