| Autor |
Beitrag |
gizmo
      
Beiträge: 61
Win 7 64Bit
RAD Studio/Delphi 2007
|
Verfasst: So 04.01.09 18:05
Hallo und ein frohes Neues,
warum geht folgendes nur auf XP Konten die Adminrechte haben?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var l:TStringlist; f:TFilename; begin f:=myHome + 'myFilename.txt'; try l:=TStringlist.Create; l.add('myData'); l.saveToFile(f); finally l.free; end; end; |
auf NichtAdmin Konten kann das Programm NIEMALS beendet werden, da der Scheibzugriff verweigert wird. Die Daten sollten aber denoch gesichert werden können. Was kann man da machen?
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Bob Murphy
      
Beiträge: 91
XP, Ubuntu
Delphi 7 SE, Delphi 2007
|
Verfasst: So 04.01.09 18:13
Wo versuchst du denn die Txt zu speichern? Kann sein das es im Anwendungsordner klappt aber sicher bin ich mir nicht....
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 04.01.09 18:18
Weil nur Admins Schreibrechte im Programmpfad haben. Lege die Ini im Anwenderverzeichnis ab
_________________ Markus Kinzler.
|
|
jaenicke
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.01.09 18:19
Im Ordner, in dem die Anwendung liegt, darf ein Programm nix schreiben. Unter Vista auch mit Standardeinstellungen schon nicht.
Mehr dazu hier:
www.delphi-library.d....php?p=541636#541636
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: So 04.01.09 18:19
Bob Murphy hat folgendes geschrieben : | | Wo versuchst du denn die Txt zu speichern? Kann sein das es im Anwendungsordner klappt aber sicher bin ich mir nicht.... |
Nein, nein, nein und nochmals nein. Niemals Daten im Anwendungsordner speichern. Bitte nie machen!
Dinge dieser Art sind dafür verantwortlich, dass Unmengen Software noch immer nicht unter eingeschränkten Benutzerkonten funktionieren.
Für Anwendungsdaten gibt es den Anwendungs datenordner. Wo der liegt, kann man mit einer API-Funktion (bitte mit der Suchfunktion im Forum nachschauen) herauskriegen.
Die Frage ist: Welchen Inhalt hat der String myHome?
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
Bob Murphy
      
Beiträge: 91
XP, Ubuntu
Delphi 7 SE, Delphi 2007
|
Verfasst: So 04.01.09 18:49
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.01.09 19:08
Den Anwendungsordner (der Ordner, in dem sich die Anwendung befindet) bekommt man mit ExtractFilePath(ParamStr(0)). Den Anwendungsdatenordner (der Ordner, der für Anwendungsdaten vorgesehen ist, beispielsweise "C:\Dokumente und Einstellungen\<Username>\Anwendungsdaten") hingegen mit z.B. SHGetFolder und CSIDL_APPDATA.
|
|
jaenicke
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.01.09 19:16
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: So 04.01.09 19:41
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
gizmo 
      
Beiträge: 61
Win 7 64Bit
RAD Studio/Delphi 2007
|
Verfasst: Mo 05.01.09 16:58
Hallo und vielen Dank für die Tipps.
myHome := ExtractFilePath(Application.ExeName);
Ich versuchte also die Datei in das "home" Verzeichnis der Anwendung zu schreiben.
Eure Ansage als Speicherort ein Verzeichnis in 'Eigene Dateien' zu wählen leuchtet mir ein.
Ich werde das ausprobieren. Falls es nicht klappt melde ich mich noch mal.
Vielen Dank.
Gizmo
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Mo 05.01.09 17:13
Wieso denn Eigene Dateien? Les dir doch mal den Link von jaenicke durch...
Anwendungsdaten ist nicht das gleiche wie die Eigenen Dateien. Wenn Programme ungefragt Dateien in den Eigenen Dateien ablegen, ist das auch extrem nervig (vgl. manche Spiele...).
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.01.09 17:16
Einfach mal einen Blick auf die CSIDL_-Konstanten werfen (APPDATA für Anwendungsdaten, PERSONAL für Eigene Dateien usw.).
|
|
jaenicke
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 18:49
gizmo hat folgendes geschrieben : | Ich versuchte also die Datei in das "home" Verzeichnis der Anwendung zu schreiben.
Eure Ansage als Speicherort ein Verzeichnis in 'Eigene Dateien' zu wählen leuchtet mir ein. |
Wie Timosch schon sagte: Niemand hat von den Eigenen Dateien geredet.
In dem Link, den ich oben ja bereits gepostet hatte, steht u.a. warum das Verzeichnis, in dem dein Programm liegt, nicht geeignet ist:
www.delphi-library.d....php?p=541636#541636
Dort ist auch dieser Beitrag verlinkt (und der Quelltext verwendet), der dir hilft, diese Ordner zu finden, die auch DeddyH eben geschrieben hat:
www.delphi-library.de/viewtopic.php?t=9428
|
|
gizmo 
      
Beiträge: 61
Win 7 64Bit
RAD Studio/Delphi 2007
|
Verfasst: Mo 05.01.09 19:45
Alles fürn A. Ich versuchte mehrmals euren Beiträgen gerechte Antworten zu formulieren, aber immer wenn fertig - ich nicht mehr eingeloggt.
Danke für Funktionen und Hilfe. Nix versthen warum speichern von LEFT und TOP so ein Drama.
Jetzt schnell abschicken. Tschüss.
|
|
gizmo 
      
Beiträge: 61
Win 7 64Bit
RAD Studio/Delphi 2007
|
Verfasst: Mo 05.01.09 22:03
So, ich habe mir jetzt aus den Beiträgen von jaenicke eine einfache Lösung zusammengestrickt.
Dort erwähnte Dinge, wie Netzwerkprofile oder portable Anwendungen finden damit keine Berücksichtigung, aber für meine Zwecke reicht es.
Vielen Dank für die Hilfe!
const
AppDataRootDir = '\ICH';
AppDataProjectDir = '\PROGI';
CSIDL_LOCAL_APPDATA = $001C;
implementation
{$R *.dfm}
Uses
ActiveX, ShlObj;
//GetSpecialFolder-----------------------------------
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
Begin
Allocator.Free (pIdL);
{$IFDEF VER100}
Allocator.Release;
{$ENDIF}
End;
Result := Path;
End;
//SaveToAppDataDir------------------------
procedure SaveToAppDataDir(l:TStringlist);
var
UserAppDataDir: String;
begin
UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir);
l.SaveToFile(UserAppDataDir+AppDataRootDir+AppDataProjectDir+'\TEST.TXT');
//showMessage(UserAppDataDir+AppDataRootDir+AppDataProjectDir+'\TEST.TXT');
end;
//TEST.........................................
procedure TForm1.Button1Click(Sender: TObject);
var l:TStringlist;
begin
try
l:=TStringlist.Create;
l.Add('left='+IntToStr(Form1.Left));
l.Add('top='+IntToStr(Form1.top));
SaveToAppDataDir(l);
finally
l.Free;
end;
end;
|
|