Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln? (https://www.delphipraxis.net/155205-zugriff-auf-ordner-oder-datei-nicht-moeglich-wie-den-grund-ermitteln.html)

Ares 13. Okt 2010 09:11

Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Hallo!

Greift ein Programm auf Dateien oder Ordner zu, die für den aktuellen Nutzer nicht freigegeben sind kommt es zu einer EFOpenError Exception:

Code:
stream := TFileStream.Create('C:\SomeFile.abc', fmOpenRead or fmShareDenyNone);
Leider kann ich aus der Exception nicht den Grund für den Fehler erkennen. Es kann wie beschrieben an fehlenden Zugriffsrechten liegen, genauso gut könnte es aber auch sein, dass die Datei bereits geöffnet ist und kein weiterer Zugriff erlaubt ist.

Der Message-Text der Exception gibt zwar genauere Auskunft, aber das ist keine verlässliche Methode. Unter anderen Windows Versionen lautet die Nachricht vielleicht nicht mehr "Zugriff verweigert" sondern "Zugriff wurde verweigert". Schon schlägt ein Test fehl. Bei anderen Sprachversionen von Windows funktioniert der Test natürlich nie.

Gibt es also eine Möglichkeit die genaue Ursache dafür zu ermitteln, dass der Zugriff nicht möglich ist?

Besten Dank!

Luckie 13. Okt 2010 09:14

AW: Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Zitat:

Zitat von Ares (Beitrag 1055454)
Der Message-Text der Exception gibt zwar genauere Auskunft, aber das ist keine verlässliche Methode. Unter anderen Windows Versionen lautet die Nachricht vielleicht nicht mehr "Zugriff verweigert" sondern "Zugriff wurde verweigert". Schon schlägt ein Test fehl.

Was denn für ein Test? Der Text gibt dir doch schon den Grund an.

Bernhard Geyer 13. Okt 2010 09:17

AW: Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Einfach bei Windows nachfragen: GetLastError

Zacherl 13. Okt 2010 09:28

AW: Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Wobei man anhand von GetLastError vermutlich auch nicht rausbekommt warum genau der Zugriff jetzt veweigert wurde. Der ErrorCode lautet ja in desem Falle immer ERROR_ACCESS_DENIED.

himitsu 13. Okt 2010 09:28

AW: Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Das Problem ist erstmal, daß
Delphi-Quellcode:
TFileStream.Create
eine Exception (EFOpenError) wirft, deren einziger genauerer Hinweis der Messages-Text ist.

Dieses Zugriff verweigert ist ein Standardtext und wird sich vermutlich nicht so schnell ändern,
abgesehn davon, daß er lokalisiert ist und in einem englischem Windows bestimmt auch englisch sein wird.

Einzige Lösung wäre sich direkt an MSDN-Library durchsuchenCreateFile zu wenden und danach GetLastError auszuwerten.

PS: GetLastError nach
Delphi-Quellcode:
TFileStream.Create
bringt garnichts Sicheres, da nach CreateFile noch einige andere APIs aufgerufen werden, bevor dieser Konstructor verlassen wird.


Also genauer geht es nicht, wie Zacherl schon sagte.
Man kann höchstens etwas mitbekommen in der Art "Datei existiert nicht", "Pfad existiert nicht", "Zugriff verweigert", "Lesefehler" oder Ähnliches.

"Zugriff verweigert" kann vieles heißen: z.B. "fehlende Benutzerrechte" oder "ungenügend Sharingrechte", wobei man letzeres aus zwei Richtungen betrachten kann "die eigenen gewährten Sharingrechte sind nicht ausreichend genut, für einen bereits existierenden/offenen Zugriff" oder "die andere Seite erlaub den eigenen Zugriff nicht" oder eine Mischung aus Beidem.

Christian Seehase 13. Okt 2010 21:50

AW: Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Moin Himitsu,

Zitat:

Zitat von himitsu (Beitrag 1055459)
"Zugriff verweigert" kann vieles heißen: z.B. "fehlende Benutzerrechte" oder "ungenügend Sharingrechte",

das sehe ich anders.
"Zugriff verweigert" deutet immer auf fehlende Rechte hin.
Wenn die Datei durch den Zugriff eines andere Programmes gesperrt ist, erhält man eher eine Meldung wie "Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird"
Fehlende Rechte sollten dabei allerdings vorgehen, falls beide Probleme vorliegen.

himitsu 14. Okt 2010 07:43

AW: Zugriff auf Ordner oder Datei nicht möglich - Wie den Grund ermitteln?
 
Gut, das könnte sein.
Hatte diesen Fehler schon lange nicht mehr gesehn, aber mir war halt so, als wenn da die Fehlermeldung nicht anders klang.
Aber wenn dem so ist, dann ist es eh besser. :-D


Was man aber nicht erfährt ist, welche Rechte und warum einem den Zugriff verwähren
oder welches Programm einem wie den Zugriff verwehrt oder ob man sich selber aussperrt.

Gut, bei den Rechten könnte man jetzt rangehn und von der Datei (eventuell auch noch von den übergeordneten Verzeichnissen und dem Datenträger) die Rechte abfragen, die eigenen Rechte auslesen und dann selber schauen was/wie/wo los ist.
Eventuell gibt's dafür ja auch schon was halbwegs Fertiges in den JEDI-Security-Libs. :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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 by Thomas Breitkreuz