Ich muss testen, ob ein Benutzer in einen Ordner schreiben kann, bevor ich dies tatsächlich versuche.
Ich habe die folgende Methode (in C # 2.0) implementiert, die versucht, die Sicherheitsberechtigungen für den Ordner mithilfe der Directory.GetAccessControl () -Methode abzurufen .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Als ich googelte, wie man auf Schreibzugriff testet, kam nichts dergleichen auf und es schien sehr kompliziert, Berechtigungen in Windows tatsächlich zu testen. Ich mache mir Sorgen, dass ich die Dinge zu stark vereinfache und dass diese Methode nicht robust ist, obwohl sie zu funktionieren scheint.
Funktioniert meine Methode zum Testen, ob der aktuelle Benutzer über Schreibzugriff verfügt, ordnungsgemäß?
c#
permissions
directory
Chris B.
quelle
quelle
Antworten:
Dies ist eine absolut gültige Methode, um in C # nach Ordnerzugriff zu suchen. Der einzige Ort , es fallen könnte nach unten ist , wenn Sie diese in einer engen Schleife anrufen müssen , wo der Aufwand einer Ausnahme kann ein Problem sein.
Es wurden bereits andere ähnliche Fragen gestellt .
quelle
Ich weiß zu schätzen, dass dies für diesen Beitrag etwas spät am Tag ist, aber Sie finden diesen Code möglicherweise hilfreich.
Legen Sie das in einer Konsolen-App ab und prüfen Sie, ob es das tut, was Sie brauchen.
quelle
GetAccessControl
aber meine Software kann tatsächlich in das Verzeichnis schreiben, das ich gerade betrachte.quelle
string tempFileName = Path.GetRandomFileName();
offensichtlichIch habe die meisten davon ausprobiert, aber sie geben aus demselben Grund falsch positive Ergebnisse aus. Es reicht nicht aus, das Verzeichnis auf eine verfügbare Berechtigung zu testen. Sie müssen überprüfen, ob der angemeldete Benutzer Mitglied einer Gruppe ist, die über diese Berechtigung verfügt Genehmigung. Dazu erhalten Sie die Benutzeridentität und prüfen, ob sie Mitglied einer Gruppe ist, die die FileSystemAccessRule IdentityReference enthält. Ich habe dies getestet, funktioniert einwandfrei ..
quelle
(AccessRight & rule.FileSystemRights) > 0
Teil derAccessRight
Mittel ist, nicht vollständig ist Zugang zuAccessRight
Zum Beispiel funktioniert diese Methode für alle Benutzer (Builtin \ Users) einwandfrei - viel Spaß.
quelle
IMHO ist die einzige 100% zuverlässige Möglichkeit zu testen, ob Sie in ein Verzeichnis schreiben können, darin zu schreiben und schließlich Ausnahmen abzufangen.
quelle
Versuche dies:
quelle
fsAccessRule.AccessControlType
könnteAccessControlType.Deny
.Ihr Code erhält das
DirectorySecurity
für ein bestimmtes Verzeichnis und behandelt eine Ausnahme (da Sie keinen Zugriff auf die Sicherheitsinformationen haben) korrekt. In Ihrem Beispiel fragen Sie das zurückgegebene Objekt jedoch nicht ab, um festzustellen, welcher Zugriff zulässig ist - und ich denke, Sie müssen dies hinzufügen.quelle
Hier ist eine modifizierte Version der Antwort von CsabaS , die explizite Regeln für die Verweigerung des Zugriffs berücksichtigt. Die Funktion durchläuft alle FileSystemAccessRules für ein Verzeichnis und prüft, ob sich der aktuelle Benutzer in einer Rolle befindet, die Zugriff auf ein Verzeichnis hat. Wenn keine solchen Rollen gefunden werden oder sich der Benutzer in einer Rolle mit verweigertem Zugriff befindet, gibt die Funktion false zurück. Übergeben Sie FileSystemRights.Read an die Funktion, um die Leserechte zu überprüfen. Übergeben Sie für Schreibrechte FileSystemRights.Write. Wenn Sie die Rechte eines beliebigen Benutzers und nicht die Rechte des aktuellen Benutzers überprüfen möchten, ersetzen Sie die gewünschte WindowsIdentity durch die aktuelle Benutzer-Windows-Identität. Ich würde auch davon abraten, sich auf solche Funktionen zu verlassen, um festzustellen, ob der Benutzer das Verzeichnis sicher verwenden kann. Diese Antwort erklärt perfekt warum.
quelle
Die oben genannten Lösungen sind gut, aber für mich finde ich diesen Code einfach und praktikabel. Erstellen Sie einfach eine temporäre Datei. Wenn die Datei erstellt wird, hat der mittlere Benutzer Schreibzugriff.
quelle
Create
Berechtigung verfügt, dies jedoch nichtDelete
der Fall ist. Dies würde false zurückgeben, obwohl der Benutzer über eine Schreibberechtigung verfügt.Path.Combine
stattdessen wiePath.Combine(tempfilepath, "temp.txt")
.Sie können versuchen, den folgenden Codeblock zu verwenden, um zu überprüfen, ob das Verzeichnis Schreibzugriff hat. Es überprüft die FileSystemAccessRule.
quelle
Ihr Code enthält eine potenzielle Race-Bedingung. Was passiert, wenn der Benutzer beim Überprüfen die Berechtigung zum Schreiben in den Ordner hat, diese Berechtigung jedoch entzogen wird, bevor der Benutzer tatsächlich in den Ordner schreibt? Das Schreiben löst eine Ausnahme aus, die Sie abfangen und behandeln müssen. Die erste Überprüfung ist also sinnlos. Sie können genauso gut einfach schreiben und Ausnahmen behandeln. Dies ist das Standardmuster für Ihre Situation.
quelle
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Sehr nützliche Klasse, prüfen Sie, ob die Version unten in den Nachrichten verbessert wurde.
quelle
Es reicht nicht unbedingt aus, nur zu versuchen, auf die betreffende Datei zuzugreifen. Der Test wird mit den Berechtigungen des Benutzers ausgeführt, der das Programm ausführt. Dies sind nicht unbedingt die Benutzerberechtigungen, gegen die Sie testen möchten.
quelle
Ich stimme Ash zu, das sollte in Ordnung sein. Alternativ können Sie deklaratives CAS verwenden und verhindern, dass das Programm überhaupt ausgeführt wird, wenn es keinen Zugriff hat.
Ich glaube, einige der CAS-Funktionen sind in C # 4.0 möglicherweise nicht vorhanden, was ich gehört habe. Ich bin mir nicht sicher, ob dies ein Problem sein könnte oder nicht.
quelle
GetAccessControl () konnte unter Windows 7 keine Ausnahme auslösen, wie in der akzeptierten Antwort empfohlen.
Am Ende habe ich eine Variation der Antwort von sdds verwendet :
Hoffe das hilft.
quelle
Ich hatte das gleiche Problem: Wie kann ich überprüfen, ob ich in einem bestimmten Verzeichnis lesen / schreiben kann? Am Ende hatte ich die einfache Lösung, um ... es tatsächlich zu testen. Hier ist meine einfache, aber effektive Lösung.
Ich hoffe es hilft !
quelle
Die meisten Antworten hier prüfen nicht auf Schreibzugriff. Es wird nur geprüft, ob der Benutzer / die Gruppe die Berechtigung lesen kann (Lesen Sie die ACE-Liste der Datei / des Verzeichnisses).
Das Durchlaufen von ACE und das Überprüfen, ob es mit der Sicherheitskennung übereinstimmt, funktioniert nicht, da der Benutzer Mitglied einer Gruppe sein kann, von der er möglicherweise Berechtigungen erhält / verliert. Schlimmer noch sind verschachtelte Gruppen.
Ich weiß, dass dies ein alter Thread ist, aber es gibt einen besseren Weg für jeden, der jetzt sucht.
Vorausgesetzt, der Benutzer verfügt über die Berechtigung zum Lesen von Berechtigungen, kann die Authz-API verwendet werden, um den effektiven Zugriff zu überprüfen.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
quelle