Autor Beitrag
gizmo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

Win 7 64Bit
RAD Studio/Delphi 2007
BeitragVerfasst: So 04.01.09 18:05 
Hallo und ein frohes Neues,

warum geht folgendes nur auf XP Konten die Adminrechte haben?
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
Bob Murphy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 91

XP, Ubuntu
Delphi 7 SE, Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 04.01.09 18:18 
Weil nur Admins Schreibrechte im Programmpfad haben. Lege die Ini im Anwenderverzeichnis ab

_________________
Markus Kinzler.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: So 04.01.09 18:19 
user profile iconBob Murphy hat folgendes geschrieben Zum zitierten Posting springen:
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 Anwendungsdatenordner. 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 91

XP, Ubuntu
Delphi 7 SE, Delphi 2007
BeitragVerfasst: So 04.01.09 18:49 
user profile iconTimosch hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBob Murphy hat folgendes geschrieben Zum zitierten Posting springen:
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 Anwendungsdatenordner. 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?



Also für mich ist der Anwendungsordner der Anwendungsdatenordner wie du es so schön sagst.... aber war ja klar das sowas kommt nech;)
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 04.01.09 19:16 
Warten wir doch einfach mal die Antwort auf die alles entscheidende Frage ab: :lol:
user profile iconTimosch hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage ist: Welchen Inhalt hat der String myHome?
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: So 04.01.09 19:41 
user profile iconBob Murphy hat folgendes geschrieben Zum zitierten Posting springen:

Also für mich ist der Anwendungsordner der Anwendungsdatenordner wie du es so schön sagst.... aber war ja klar das sowas kommt nech;)

Sorry, dachte, dass du mit Anwendungsordner den Ordner, in dem das Programm selbst liegt, meinst.



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Warten wir doch einfach mal die Antwort auf die alles entscheidende Frage ab: :lol:
user profile iconTimosch hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage ist: Welchen Inhalt hat der String myHome?

42 :mrgreen:

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
gizmo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

Win 7 64Bit
RAD Studio/Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 05.01.09 18:49 
user profile icongizmo hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconTimosch 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 user profile iconDeddyH eben geschrieben hat:
www.delphi-library.de/viewtopic.php?t=9428
gizmo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

Win 7 64Bit
RAD Studio/Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

Win 7 64Bit
RAD Studio/Delphi 2007
BeitragVerfasst: 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;