Prüfen auf Schreibrechte für eine Datei in C#
Saturday, February 28th, 2009Hallo,
manchmal möchte man wissen, ob ein bestimmter Benutzer bestimmte Rechte (z.B. Schreibrechte) für eine bestimmte Datei besitzt. Wie sich herausstellt, ist diese Anforderung alles andere als leicht umzusetzen, weil dabei viele verschiedene Aspekte eine Rolle spielen. Die Vorgehensweise sieht prinzipiell so aus:
- Abfragen der Access Control Listen für die Datei
- Itererieren über alle Einträge und prüfen ob man für die Kennung oder die Gruppe des gewünschten Benutzers Einträge findet
- Dabei die Präzedenz der Einträge beachten (explizite kommen vor vererbten Regeln, “Deny”-Regeln kommen for “Allow”-Regeln)
Den nicht unerheblichen Code hat dankenswerterweise Bruce Hatt in einem Artikel auf CodeProject.com veröffentlicht.
Man sollte bedenken, dass die Möglichkeit in eine Datei zu schreiben zusätzlich durch das “ReadOnly-flag” und die .NET Code Access Security eingeschränkt sein könnte. Beides wird in dieser Klasse nicht berücksichtigt.
Die Prüfung auf das ReadOnly-flag könnte man so schreiben:
FileAttributes attrs = File.GetAttributes(fileName); if ((attrs & FileAttributes.ReadOnly) != 0) { readOnly = true; }
Und für die Prüfung im Rahmen der CAS könnte man folgenden Code verwenden:
FileIOPermission fp = new FileIOPermission(FileIOPermissionAccess.Write, fileName); try { fp.Demand(); } catch (SecurityException) { readOnly = true; }
Wenn es nur um die Prüfung auf Schreibrechte geht, hört man oft den Vorschlag, einfach den Schreibvorgang auszuführen und ggf. die geworfene Exception zu fangen. Dieser Vorschlag ist aber nicht immer geeignet. In meinem Fall war es so, dass ich an einer Anwendung arbeite, in der Dateien editiert werden können. Falls Dateien nicht geschrieben werden können, soll dies visualisiert werden. Man möchte aber vermeiden, dazu bei jedem Start der Anwendung die zu editierenden Texte zu speichern, da damit der Timestamp verändert wäre, obwohl der Benutzer die Datei gar nicht geändert hat und auch nicht speichern wollte.
Viele Grüße,
Andreas
Technorati Tags: .NET Security, File Permissions