Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Nichtvirtualisierter Ordner auf Win7? (https://www.delphipraxis.net/162907-nichtvirtualisierter-ordner-auf-win7.html)

frieder2008 9. Sep 2011 09:05

Nichtvirtualisierter Ordner auf Win7?
 
Moin zusammen,

ich habe jetzt eine geschlagene Stunde gesucht, aber nichts geeignetes gefunden: In meinem Programm wird im Programmverzeinis (extract..paramstr(0)) ein temp-Ordner erstellt, in dem Daten abgelegt und aufgerufen werden.

Unter Win XP nie ein Problem gewesen. Unter Win7 (64) auch kein Problem, sofern das Programm nicht in einem der Systemverzeichnisse (system/programme usw.) liegt. Wird das Programm aber im App-Verzeichnis (C:\Program Files (x86)) installiert, wird der temp-Ordner automatisch im VirtualStore gespeichert. Um damit verbundene Probleme einfach zu umgehen, suche ich einen (windows-versionen-übergreifenden) Ordner, in dem ich mein temp anlegen könnte. Ich habe es dann auch mit dem Windows-temp-Verzeichnis (ermittelt aus den Umgebungsvariablen) versucht, aber das klappt nicht (directoryexists macht dann schon Probleme).

Hat jemand eine Idee
a) wie ich den VirtualStore über mein Programm deaktivieren oder
b) für einen virtualstore-unabhängigen, aber systemübergreifenden Ordner?

Danke und schöne Grüße aus dem Süden,
Frieder

Bernhard Geyer 9. Sep 2011 09:21

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von frieder2008 (Beitrag 1122839)
a) wie ich den VirtualStore über mein Programm deaktivieren oder

Dein Programm braucht ein entsprechendes Manifest. Neue Delphi-Versionen fügen diese automatisch hinzu. Für alte Delphi-Versionen muss man diese selbst hinzufügen.

Zitat:

Zitat von frieder2008 (Beitrag 1122839)
b) für einen virtualstore-unabhängigen, aber systemübergreifenden Ordner?

Wie wäre es mit dem Windows-Temp-Ordner?

frieder2008 9. Sep 2011 09:33

AW: Nichtvirtualisierter Ordner auf Win7?
 
Hallo Bernhard,

danke für Deine Antwort:
- Problem 1 (D5): "Manifest": - Gibt es hierzu ein Tutorial? Ich habe bislang keine Ahnung von den Parametern, welche wie sein müssen, damit das Programm automatisch alle Zugriffsrechte hat. Von himitsu habe ich folgendes gefunden, aber kann eben nicht beurteilen, ob das schon reicht:

http://www.delphipraxis.net/771563-post4.html

- Problem 2: Windows-temp-Verzeichnis habe ich versucht: Habe das Verzeichnis ermittelt und prüfe, ob bereits ein "meintemp" da ist (beim Starten von mehreren Instanzen des eigenen Progs). Leider produziert directoryexists (D5) immer true, obwohl def. kein Temp-Verzeichnis da ist:

Delphi-Quellcode:
function GetTempDir: string;
var
  Dir: string;
  Len: DWord;
begin
  SetLength(Dir,MAX_PATH);
  Len:=GetTempPath(PChar(Dir),MAX_PATH);
  if Len>0 then
  begin
    SetLength(Dir,Len);
    Result:=Dir;
  end
  else
    RaiseLastOSError;
end;

while DirectoryExists(pchar(tempdirstr + '\meintemp' + inttostr(i))) do
  inc(i); //--> Endlosschleife..
CreateDir(tempdirstr + '\meintemp' + inttostr(i));
Woran kann das liegen?

Danke und Gruß,
frieder

Union 9. Sep 2011 09:39

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1122842)
Wie wäre es mit dem Windows-Temp-Ordner?

Da hatte er ja geschrieben dass es nicht funktioniert.

Im allgemeinen finde ich aber den ganzen Ansatz falsch. Man programmiert für Windows und sollte sich an die Konventionen halten. Also eben NICHT Exename oder paramstr Gefrickel, sondern SHGetSpecialFolder.

himitsu 9. Sep 2011 09:43

AW: Nichtvirtualisierter Ordner auf Win7?
 
Du, bzw. dein Programm hast im Programmeverzeichnis (Zurecht) keine Schreibrechte mehr, als "normaler" Benutzer.

PS: Das war schon unter XP so, wenn man nur nicht ständig mit vollen Adminrechten arbeiten und so diese Sperren umgehen würde. :zwinker:


Das Manifest im XE ist aber nur ein GUI-Manifest, für die neuen Commoncontrols.
Der VirtualStore (Kompatibilität mit Win7 und/oder Vista) oder die Benutzerrechte werden damit nicht geregelt.

Infos zu Manifesten (vorallem das sogenannte Admin-Manifest) gibt es zu genüge in der DP zu finden.
oder unter Hier im Forum suchenManifest-Creator, wo auch ein paar Infos/Hintergründe genannt werden.


Es bleibt aber zu empfehlen, daß du dich an den vordefinierten Temp-Ordner wendest.
Im Notfall könnte man sich auch (temporär) ein Unterverzeichnis darin erstellen.

Luckie 9. Sep 2011 09:45

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von frieder2008 (Beitrag 1122839)
Unter Win XP nie ein Problem gewesen.

Klar, weil du immer als Administrator gearbeitet hast. bei mir würde dein Programm nicht funktionieren, weil es keine Schreibrechte im Programmeordner hätte, da ich nur als normaler Benutzer an meinem Rechner arbeite.

Zitat:

Unter Win7 (64) auch kein Problem, sofern das Programm nicht in einem der Systemverzeichnisse (system/programme usw.) liegt.
Weil du da auch keine Schreibrechte hast. Selbst wenn du als Administrator unter Vista und höher angemeldet bist, hast du erst mal nur eingeschränkte Rechte, es sei denn dein Programm hat ein Manifest, welches höhere rechte anfordert, dann poppt die UAC auf.

Zitat:

Wird das Programm aber im App-Verzeichnis (C:\Program Files (x86)) installiert, wird der temp-Ordner automatisch im VirtualStore gespeichert.
Habe ich die Sache mit den Rechten schon erwähnt? ;) Damit auch alte Programme laufen, die es "gewöhnt" waren als Administrator ausgeführt zu werden (Standardkonto bei XP), hat Microsoft die Virtualisierung entwickelt, welche solche Schreibzugriffe einfach umbiegt.

Zitat:

Um damit verbundene Probleme einfach zu umgehen, suche ich einen (windows-versionen-übergreifenden) Ordner, in dem ich mein temp anlegen könnte. Ich habe es dann auch mit dem Windows-temp-Verzeichnis (ermittelt aus den Umgebungsvariablen) versucht, aber das klappt nicht (directoryexists macht dann schon Probleme).
Benutze das Temporäreverzeichnis, dafür ist es da. Und so kannst du den Pfad ermitteln:
Delphi-Quellcode:
function GetTempDir(): string;
var
  Size: DWORD;
  Len: DWORD;
begin
  Size := MAX_PATH;
  SetLength(Result, Size);
  Len := GetTempPath(Size, PChar(Result));
  if Len > 0 then
    SetLength(Result, Len)
  else
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
Ich glaube, dein Problem ist nicht die Ermittlung des Temporärenverzeichnisses, sondern das was du danach machst in der Schleife. Lass dir mal die Zeichenkette anzeigen (Zwischenspeichern in einer Variable) und guckt, was du dir da zusammenbastelst.

Bernhard Geyer 9. Sep 2011 09:57

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von Union (Beitrag 1122851)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1122842)
Wie wäre es mit dem Windows-Temp-Ordner?

Da hatte er ja geschrieben dass es nicht funktioniert.

Im allgemeinen finde ich aber den ganzen Ansatz falsch. Man programmiert für Windows und sollte sich an die Konventionen halten. Also eben NICHT Exename oder paramstr Gefrickel, sondern SHGetSpecialFolder.

Ich mein doch den Ordern den Windows dafür vorsieht. Der name SHGetSpecialFolder war mir gerade entfallen.

DeddyH 9. Sep 2011 10:11

AW: Nichtvirtualisierter Ordner auf Win7?
 
IIRC lässt sich mit SHGetSpecialFolder aber nicht der TEMP-Ordner ermitteln, da es dafür keine CSIDL gibt. Aber GetTempPath sollte das gewünschte Ergebnis bringen wie oben gezeigt.

frieder2008 9. Sep 2011 10:13

AW: Nichtvirtualisierter Ordner auf Win7?
 
Also zunächst mal danke für die Antworten.. Man lernt nie aus :oops:

Wenn ich richtig sehe, ist das einfachste, das Windows-temp-Verzeichnis einzubinden. Das wollte ich ja auch...

Zitat:

Ich glaube, dein Problem ist nicht die Ermittlung des Temporärenverzeichnisses, sondern das was du danach machst in der Schleife. Lass dir mal die Zeichenkette anzeigen (Zwischenspeichern in einer Variable) und guckt, was du dir da zusammenbastelst.
Das Windows-Temp-Verzeichnis (via gettemppath) wird korrekt ermittelt. Ich verstehe nicht, warum existdirectory fälschlicherweise "true" zurückgibt?!?

Und noch eine andere Frage: Ich lasse im Setup auch andere *exe in das App-Verzeichnis installieren, auf das dann das Hauptprogramm via shellexec.. zugreift. Funktioniert der Zugriff dann ohne Admin-Rechte auch nicht mehr?!? :gruebel:

Danke und Gruß,
frieder

DeddyH 9. Sep 2011 10:15

AW: Nichtvirtualisierter Ordner auf Win7?
 
Du meinst, ob sich die Programme starten lassen? Das sollte im Normalfall weiterhin möglich sein, solange Du nicht versuchst, in die Exen hineinzuschreiben :)

frieder2008 9. Sep 2011 10:21

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von DeddyH (Beitrag 1122865)
solange Du nicht versuchst, in die Exen hineinzuschreiben :)

Nein, das hatte ich nicht vor ;)

himitsu 9. Sep 2011 10:24

AW: Nichtvirtualisierter Ordner auf Win7?
 
Jupp, es fehlen nur die Schreibrechte.
Lesen und Ausführen sollte standardmäßig kein Problem darstellen.

Willst du hineinschreiben, brauchst du die nötigen Rechte,
welche standardmäßig Administratoren und Backupbenutzer besitzen.


Und wie schon erwähnt, werden (selbst in einem Benutzerkonto) alle Programme erstmal standardmäßig, über das UAC, mit eingeschränkten Rechten ausgeführt, es sei denn es liegt ein entsprechendes Manifest vor, oder man startet das Programm manuell mit Adminrechten.


Halt Schutzmaßnahmen, damit sich keine Viren/Würmer/Trojaner dort einnisten können.

frieder2008 9. Sep 2011 10:29

AW: Nichtvirtualisierter Ordner auf Win7?
 
Ok, ich hab den (peinlichen) Fehler gefunden: directoryexists hat nach einem Temp-Verzeichnis gesucht, das ein "\" zuviel hatte.. An anderen Stellen (z.B. beim Speichern einer File) hat das aber keine Probleme gemacht.. Naja, sauberer isses jetzt.

Letzte Frage, um sicher zu gehen (habe gerade keine Möglichkeit, auf anderen Systemen wie Vista etc. zu testen): Auf das Windows-temp-Verzeichnis habe ich IMMER Schreibrechte (auch als nicht-Admin) oder kann mir da unter best. Bedingungen was ähnliches passieren wie bei App-/System-Verzeichnis? Anders gefragt: bezieht sich der Virtualstore NIE auf das Win-Temp-Verzeichnis?

Danke Euch für die Mühe und beste Grüße,
frieder

DeddyH 9. Sep 2011 10:32

AW: Nichtvirtualisierter Ordner auf Win7?
 
Ein Admin kann die Rechte auf dem System (beinahe) beliebig vergeben, verlassen darfst Du Dich also nicht auf entsprechende Rechte. Allerdings solltest Du im Normalfall immer Schreibrechte im Temp-Verzeichnis haben, ansonsten dürfte der entsprechende Benutzer auch an anderer Stelle bzw. mit anderer Software Probleme bekommen.

bernerbaer 9. Sep 2011 10:37

AW: Nichtvirtualisierter Ordner auf Win7?
 
Irgendwie missfällt mir dabei der Begriff "Windows-temp-Verzeichnis". Dieses Verzeichnis gibt es eigentlich nicht mehr. Unter neueren Windows Versionen werden temporäre Dateien spezifisch für den angemeldeten Benutzer gespeichert, das heisst, für jeden Benutzer gibt es ein separates Verzeichnis. Dadurch sollte eigentlich auch sichergestellt sein, dass jeder User auf dieses (sein) Verzeichnis volle Zugriffsrechte hat. Ein Admin, der dieses Verzeichnis sperrt, verdient den Namen Admin m.E. nicht.

Union 9. Sep 2011 10:40

AW: Nichtvirtualisierter Ordner auf Win7?
 
Code:
TEMP=C:\Users\ADMINI~.SOF\AppData\Local\Temp\2

bernerbaer 9. Sep 2011 11:06

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von Union (Beitrag 1122880)
Code:
TEMP=C:\Users\ADMINI~.SOF\AppData\Local\Temp\2

Was willst Du damit sagen?

Normalerweise gilt bei Windows nach Windows98 für den Tempordner:
Code:
TEMP=%USERPROFILE%\AppData\Local\Temp

Union 9. Sep 2011 11:11

AW: Nichtvirtualisierter Ordner auf Win7?
 
Das mag ja sein, in meinem Environment findet sich aber die zitierte "expandierte" Form. Es wird nämlich wegen RDP noch die Session-Nummer angehängt.

Luckie 9. Sep 2011 11:34

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von bernerbaer (Beitrag 1122878)
Irgendwie missfällt mir dabei der Begriff "Windows-temp-Verzeichnis". Dieses Verzeichnis gibt es eigentlich nicht mehr. Unter neueren Windows Versionen werden temporäre Dateien spezifisch für den angemeldeten Benutzer gespeichert, das heisst, für jeden Benutzer gibt es ein separates Verzeichnis. Dadurch sollte eigentlich auch sichergestellt sein, dass jeder User auf dieses (sein) Verzeichnis volle Zugriffsrechte hat. Ein Admin, der dieses Verzeichnis sperrt, verdient den Namen Admin m.E. nicht.

Und genau dieses Verzeichnis bekommt er mit meiner Funktion.

Zitat:

Zitat von frieder2008 (Beitrag 1122872)
Ok, ich hab den (peinlichen) Fehler gefunden: directoryexists hat nach einem Temp-Verzeichnis gesucht, das ein "\" zuviel hatte..

genau wie ich vermutet habe. Beim nächsten mal vorher debuggen.

himitsu 9. Sep 2011 11:51

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von bernerbaer (Beitrag 1122892)
Normalerweise gilt bei Windows nach Windows98 für den Tempordner:
Code:
TEMP=%USERPROFILE%\AppData\Local\Temp

Außer z.B. bei gewissen Serverversionen, wie Server2008, wo man nochmals ein Subverzeichnis erstellen lassen kann, abhängig vom Terminal-Login, welches bei jedem (neuen) einloggen geleert wird.

bernerbaer 9. Sep 2011 11:53

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von Luckie (Beitrag 1122908)
Zitat:

Zitat von bernerbaer (Beitrag 1122878)
Irgendwie missfällt mir dabei der Begriff "Windows-temp-Verzeichnis". Dieses Verzeichnis gibt es eigentlich nicht mehr. Unter neueren Windows Versionen werden temporäre Dateien spezifisch für den angemeldeten Benutzer gespeichert, das heisst, für jeden Benutzer gibt es ein separates Verzeichnis. Dadurch sollte eigentlich auch sichergestellt sein, dass jeder User auf dieses (sein) Verzeichnis volle Zugriffsrechte hat. Ein Admin, der dieses Verzeichnis sperrt, verdient den Namen Admin m.E. nicht.

Und genau dieses Verzeichnis bekommt er mit meiner Funktion.

Ja, klar Deine Funktion ist einwandfrei - ich habe sie auch nie angezweifelt! Ich wollte halt nur darauf hinweisen, dass es nicht nur EINEN Windows-Temp Ordner geben muss, sondern dass für jeden User ein Temp-Ordner existiert.

DeddyH 9. Sep 2011 11:55

AW: Nichtvirtualisierter Ordner auf Win7?
 
Ich denke, der Begriff "Windows-Tempordner" bezog sich lediglich darauf, dass man den für den aktuellen Benutzer gültigen und mit Windows-Bordmitteln zu erfragenden Ordner verwenden soll anstatt einen eigenen irgendwo anzulegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 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