Entwickler-Ecke
Dateizugriff - NTFS Berechtigungen einer Datei mit Delphi auslesen?
N8Falter74 - Mo 15.08.05 15:55
Titel: NTFS Berechtigungen einer Datei mit Delphi auslesen?
Hallo Forum
ich habe folgendes Problem:
In einer Datenbanktabelle habe ich eine liste mit Dateinamen. Mit meiner Anwendung kann man
in dieser Liste suchen und sich die Dateien anzeigen lassen. Also nix besonderes.
Die Dateien liegen auf einem Windows Server in einer Freigabe.
Die Freigabe verweist auf ein Verzeichnis einer NTFS Partition.
Das klappt auch alles soweit wunderbar, solange der Benutzer mindestens Leserechte
auf die Dateien hat.
Nun möchte aber der Admin bestimmte Dateien und Unterordner für einige Benutzer per
NTFS Rechte sperren - und hier ist dann das Problem: Die Anwendung stürzt mit 2-3
Schutzverletzungen und Fehlermeldungen ab wenn ein Benutzer versucht auf eine per
NTFS gesperrte Datei zuzugreifen.
Wie kann ich aus Delphi feststellen, ob ich auf eine bestimmte Datei zugreifen darf oder nicht.
Am liebsten wäre sowas wie: function FileAccessable(FileName: String): boolean. :D
Hat jemand ne idee?
mfg
Sebastian
PS: FileExists bringt an dieser Stelle nix, die Datei ist ja da, nur kein Zugriffsrecht. :(
azubi_20 - Mo 15.08.05 16:34
Bei NTFS kannst du mit der API-Funktion GetFileAttributes die Attribute der Datei anzeigen lassen. Ich benutz das nicht so häufig und hab jetzt hier gerade kein Delphi, kann dir deshalb kein Beispiel geben :cry:
uall@ogc - Mo 15.08.05 16:52
ich kann dir jetzt auch keine directe api lösung nennen,
aber nen FileAccessable kannste doch ganz leicht mit einem try finally nachbaun
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function FileAccessable(Filename: String): boolean; var f: file of byte; begin result := false; Assigfile(f,Filename); try Reset(f); result := true; finally CloseFile(f); end; end; |
ungetestet
N8Falter74 - Mo 15.08.05 18:05
@azubi_20
Danke für den Tip mit GetFileAttributes ich werde mir das mal bei Zeiten etwas genauer ansehen.
Ist mit Sicherheit nicht schlecht, wenn man alle Attribute auslesen kann und richtig auf alle
reagieren kann. Mit Sicherheit gibt es auch ein SetFileAttributes... das könnte ich u.u. auch
gut in meiner Anwendung verwenden.
@uall@ogc
Ha! Da hätte ich ja auch drauf kommen können... Manchmal denkt man einfach zu kompliziert.
Ich werde das jetzt erst mal so umsetzten und wenn ich etwas mehr Luft habe, werde ich mir
mal die API, die azubi_20 vorgeschlagen hat, ansehen.
Danke erstmal.
Sebastian
N8Falter74 - Mo 15.08.05 19:31
N8Falter74 hat folgendes geschrieben: |
@uall@ogc
Ha! Da hätte ich ja auch drauf kommen können... Manchmal denkt man einfach zu kompliziert.
Ich werde das jetzt erst mal so umsetzten und wenn ich etwas mehr Luft habe, werde ich mir
mal die API, die azubi_20 vorgeschlagen hat, ansehen.
|
Tja, da hatte ich mich wohl etwas zu früh gefreut. AssignFile(f, FileName) erzeugt beim
Zugriff auf eine mit NTFS gesperrte Datei einen "E/A Fehler 1xx" der auch nicht durch das
try - finally oder auch ein try - except abgefangen wird... komisch :?:
Naja, die Idee war ja nicht schlecht und deshalb habe ich es mal mit der FileOpen Funktion
versucht. Und siehe da, damit geht es. Sollte eine FileOpen Funktion nicht auf eine Datei
zugreifen können, liefert sie als File Handle -1 zurück.
Die Delphi Hilfe meint zwar man solle FileOpen usw. nicht verwenden, da Sie Delphi inkompatible
System Handles zurückliefert - aber für den Zugriffschutz Test denke ich, ist das schon ok :)
Hier der Code falls nochmals jemand sowas braucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function FileAccessable(FileName:String): boolean; var iFile: Integer; begin try iFile := FileOpen(FileName, fmOpenRead); if iFile > 0 then result := True else result := False; finally FileClose(iFile); end; end; |
Liebe Grüße
Sebastian
drstar - Mi 17.08.05 16:19
Laufzeitfehler dieser Art entstehen häufig dadurch, daß der Progger sich nicht in ausreichendem Maße darum kümmert, Fehlerbehandlungsroutinen zu implementieren.
Dafür gibt es in diesem konkreten Fall diese Möglichkeit:
...Code...
ASSIGN(F, FName);
{$I-}
RESET(F);
Result := IORESULT;
{$I+}
if Result<>0
then
case Result OF
1: Meldung Fehler xyz aufgetreten... (z. B. Zugriff verweigert/ Access denied, stimmt für diesen Code natürlich nicht...)
2: Meldung Fehler xyz aufgetreten...
...
end;
end;
Delete - Mi 17.08.05 16:30
azubi_20 hat folgendes geschrieben: |
| Bei NTFS kannst du mit der API-Funktion GetFileAttributes die Attribute der Datei anzeigen lassen. |
Das halte ich aber für ein gerücht:
| Zitat: |
The GetFileAttributes function retrieves attributes for a specified file or directory.
This function retrieves a set of FAT-style attribute information.
|
Das sind die ganz normalen Dateiattribute wie Archiv, Schreibgeschütz, Versteckt usw. Er will aber wissen, welche Rechte ein benutzer an einer bestimmten Datei hat. Und das hat mit dieser Funktion gar nichts zu tun.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!