[Gelöst] NTFS-Zugriffsrechte und temporäre Dateien

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

[Gelöst] NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von Nino »

Hallo,

ich habe eine unangenehme Überraschung bei der Verwendung von temporären Dateien erlebt und dachte, ich teile die Erfahrung hier mal.

Ich habe hier im Computer unter Windows 10 nur eine Festplatte als Laufwerk C: (NTFS), darauf ist auch der Webserver XAMPP installiert, und das Verzeichnis

Code: Alles auswählen

c:\xampp\htdocs\mysite\
enthält die Dateien einer Website. Dieses Verzeichnis ist im Prinzip von allen Benutzerkonten des PCs aus les- und beschreibbar.

Kürzlich habe ich als Benutzer "Nino" mit einem PB-Programm HTML-Dateien in dem Verzeichnis geändert. Dabei bin ich bei jeder Datei so vorgegangen:
  1. Inhalt der Originaldatei nach und nach in Strings lesen.
  2. Jeweils gewünschte Änderungen an den Strings vornehmen und diese in eine temporäre Datei im %temp%-Verzeichnis des aktuellen Benutzers schreiben; also in dem Verzeichnis das die PB-Funktion GetTemporaryDirectory() liefert.
  3. Beide Dateien schließen.
  4. Originaldatei löschen.
  5. Temporäre Datei in Originaldatei umbenennen.
Das hat auch alles soweit gut funktioniert.
Nur musste ich später feststellen, dass ich die so geänderten Dateien unter einem anderen Benutzerkonto nicht einmal zum Lesen öffnen konnte!
Damit hatte ich nicht gerechnet, denn wie gresagt ist

Code: Alles auswählen

c:\xampp\htdocs\mysite\
im Prinzip von allen Benutzerkonten des PCs aus les- und beschreibbar.
Offenbar hatten die Dateien die Zugriffsrechte behalten, die für das %temp%-Verzeichnis des Benutzers "Nino" gelten. Dort waren sie ja erzeugt, und später "nur noch" verschoben worden.
Inzwischen habe ich Hintergrundinformationen zu diesem Problem gefunden, das offenbar nicht nur mich irritiert hat. Die auf dieser Seite getroffene Feststellung, dass Microsofts neue Regeln ab Windows Vista zur Lösung des Problems nicht immer funktionieren, kann ich nur bestätigen. Denn bei mir läuft Windows 10.

Mit dem folgenden vereinfachten Code lässt sich das Problem reproduzieren.

Code: Alles auswählen

; Windows 10 (Dateisystem NTFS), PB 5.61
; Programm ausgeführt unter Account ganz ohne oder mit eingeschränkten Administratorrechten

EnableExplicit

Procedure Create (file$)
   If CreateFile(0, file$)
      WriteStringN(0, "<!DOCTYPE html>")
      WriteStringN(0, "<html lang='de'>")
      CloseFile(0)
   EndIf
EndProcedure

Procedure Rename1 (file$)
   ; Das temporäre Verzeichnis ist immer auf Laufwerk C:.
   Protected tempFile$ = GetTemporaryDirectory() + GetFilePart(file$)
   Create(tempFile$)
   RenameFile(tempFile$, file$)
EndProcedure

Procedure Rename2 (file$)
   Protected tempFile$ = file$ + ".tmp"
   Create(tempFile$)
   RenameFile(tempFile$, file$)
EndProcedure


Define target$ = "c:\xampp\htdocs\mysite\<User>"   ;  <===  <User> anpassen  #####

;                                möglicher Zugriff auf Zieldatei unter anderem Account
;                                (ganz ohne oder mit eingeschränkten Administratorrechten)
;                                ---------------------------------------------------------
Create (target$ + ".htm")      ; lesen und schreiben
Rename1(target$ + "_r1.htm")   ; * nicht einmal lesen *
Rename2(target$ + "_r2.htm")   ; lesen und schreiben
Schlussfolgerung
Wenn beim Bearbeiten einer Datei eine temporäre Datei erzeugt wird die später in die Ursprungsdatei umbenannt werden soll, so sollte sie wegen der Zugriffsrechte nicht im %temp%-Verzeichnis erzeugt werden, sondern wohl am besten in dem Verzeichnis in dem sich die Ursprungsdatei befindet.
Zuletzt geändert von Nino am 29.10.2017 16:04, insgesamt 2-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von RSBasic »

Diese Vorgehensweise habe ich bis jetzt noch nie so angewendet, aber gut zu wissen. Danke für die Information. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von NicTheQuick »

Unter Linux ist das Standard so. Wenn du eine Datei verschiebst, die einem bestimmten Nutzer gehört, dann gehört sie ihm später immer noch, denn die Dateizugriffsrechte gehören der Datei, nicht dem Ordner. Aber als Inhaber einer Datei müsste man doch in der Lage sein die Dateirechte so zu erweitern, dass andere auch darauf zugreifen können. Naja, hab mich aber auch nicht weiter unter Windows damit beschäftigt.
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von GPI »

Da man bei Windows nie weis, wo die temporären Dateien landen, ist umbennen sogar eine sehr schlechte Idee. Das kann durchaus ein anderes Laufwerk sein und "Move" schlägt fehl.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von GPI »

NicTheQuick hat geschrieben:Aber als Inhaber einer Datei müsste man doch in der Lage sein die Dateirechte so zu erweitern, dass andere auch darauf zugreifen können. Naja, hab mich aber auch nicht weiter unter Windows damit beschäftigt.
Sollte auch unter windows gehen. Nur gibts halt keine PB-Befehle dafür.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von Nino »

Hallo,

danke für Eure Antworten!
GPI hat geschrieben:Da man bei Windows nie weis, wo die temporären Dateien landen, ist umbennen sogar eine sehr schlechte Idee. Das kann durchaus ein anderes Laufwerk sein und "Move" schlägt fehl.
Interessanter Weise funktioniert PureBasics RenameFile() anscheinend auch, wenn Quelle und Ziel auf verschiedenen Laufwerken sind (getestet mit PB 5.61 unter Windows 10). Auch im Beispiel in der Dokumentation wird das gemacht, dieses Feature ist dort allerdings nicht ausdrücklich erwähnt. :-( Insofern bin ich nicht sicher, ob dies eine "offizielle" Eigenschaft von RenameFile() ist.
GPI hat geschrieben:
NicTheQuick hat geschrieben:Aber als Inhaber einer Datei müsste man doch in der Lage sein die Dateirechte so zu erweitern, dass andere auch darauf zugreifen können. Naja, hab mich aber auch nicht weiter unter Windows damit beschäftigt.
Sollte auch unter windows gehen. Nur gibts halt keine PB-Befehle dafür.
Das ist mir in dem Zusammenhang auch aufgefallen, dass in PB das Thema "Zugriffsrechte auf Dateien und Ordner" völlig außen vor gelassen wird. :|
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von _JON_ »

Du könntest doch die DACL der alten Datei sichern und nach dem kopieren wiederherstellen.

Code: Alles auswählen

Procedure FileGetDACL(sFilename.s)
  
  #DACL_SECURITY_INFORMATION = 4
  
  Protected cbsize, *buffer
  GetFileSecurity_(sFilename, #DACL_SECURITY_INFORMATION, 0, 0, @cbsize)
  If cbsize
    *buffer = AllocateMemory(cbsize)
    If *buffer
      If GetFileSecurity_(sFilename, #DACL_SECURITY_INFORMATION, *buffer, cbsize, @cbsize)  
        ProcedureReturn *buffer
      EndIf    
      FreeMemory(*buffer)
    EndIf
  EndIf
EndProcedure

Procedure FileSetDACL(sFilename.s, *Security)
  
  #DACL_SECURITY_INFORMATION = 4

  If SetFileSecurity_(sFilename, #DACL_SECURITY_INFORMATION, *Security)
    ProcedureReturn 1
  EndIf
  
EndProcedure
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von RSBasic »

@_JON_
Danke für den Beispielcode, den ich gerne in meine WinAPI Library übernehmen kann.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von NicTheQuick »

Ich würde mir das ja alles sparen und einfach die originale Datei leeren und neu beschreiben anstatt sie neu zu erstellen. Dann sollten die Berechtigungen ebenfalls genau so bleiben wie sie zuvor waren.
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: NTFS-Zugriffsrechte und temporäre Dateien

Beitrag von Nino »

@_JON_:
Ich habe mich mit diesem Thema "programmiermäßig" noch nie beschäftigt.
Der Code ist lehrreich, danke!
In diesem Fall finde ich es aber einfacher, die temporäre Datei im selben Verzeichnis wie die Ursprungsdatei zu erzeugen. Dann sind keine weiteren Maßnahmen nötig.
NicTheQuick hat geschrieben:Ich würde mir das ja alles sparen und einfach die originale Datei leeren und neu beschreiben anstatt sie neu zu erstellen. Dann sollten die Berechtigungen ebenfalls genau so bleiben wie sie zuvor waren.
Das habe ich auch überlegt. :-) Dann muss allerdings der komplette Dateiinhalt im Speicher gehalten werden und ich dachte, dass das bei großen Dateien zu Problemen führen kann. Oder kann ich mich darauf verlassen, dass das Betriebssystem sich darum kümmert (und bei Bedarf Inhalte in die Swap-Datei auslagert)?
Antworten