Frage C # - Windows ACL - Vererbte Berechtigungen anwenden


Ich habe Probleme beim programmatischen Zuweisen von Berechtigungen zu Ordnern / Registrierungseinträgen. Ich habe es geschafft, vererbende Berechtigungen unter Verwendung des folgenden Codes zuzuweisen:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow);

DirectorySecurity security = new DirectorySecurity(); 
security.SetAccessRule(rule);

Directory.CreateDirectory(dir);
Directory.SetAccessControl(dir, security);

Damit werden meine Dateiberechtigungen für alle untergeordneten Ordner, die ich als Administrator erstelle, korrekt festgelegt. Es setzt jedoch nicht die Berechtigungen für die dir Ordner selbst. Ich habe mit ein paar Vertauschungen um Vererbung und Verbreitung herumgespielt, hatte aber keine Freude.

Zum Beispiel habe ich:

dir = %programfiles%\Test

Wenn ich einen Ordner im Test erstellt habe (%programfiles%\Test\SubFolder), Ich habe volle Berechtigungen für meinen Benutzer zugewiesen, aber ich habe keine vollständigen Berechtigungen für %programfiles%\Test. Das ist wirklich ärgerlich, da ich meinem Benutzer die vollen Berechtigungen geben möchte, was auch immer mit dem Test-Verzeichnis zu tun.

Ich habe ähnliche Probleme mit Registrierungsberechtigungen, aber ich glaube, dass, wenn ich einen lösen kann, ich beide ausstehenden Probleme lösen kann.

Weiß jemand, wie das gelöst werden kann?

Grüße
Tris


6
2017-09-11 15:47


Ursprung


Antworten:


Für den Ordner:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, 
    FileSystemRights.FullControl, AccessControlType.Allow);

Für Unterordner und Dateien:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME,
    FileSystemRights.FullControl, InheritanceFlags.ContainerInherit |  
    InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, 
    AccessControlType.Allow);

Beide Zeilen müssen in Ihrem Projekt enthalten sein. Dann erhalten Sie einen acl, der für diesen Ordner, Unterordner und Dateien gilt


14
2017-10-06 20:40



Ich bin hier kaum ein Experte, aber nachdem ich das für meine eigenen Zwecke herausgefunden habe, glaube ich, dass Daves Antwort, obwohl funktional, übermäßig kompliziert ist. Sie sollten dies mit nur einer Regel erreichen können:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME,
    FileSystemRights.FullControl,
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
    PropagationFlags.None, 
    AccessControlType.Allow);

Das PropagationFlags.InheritOnly Der vom OP in seinem ursprünglichen Code verwendete Parameter verhindert, dass die Zugriffsregel auf das Objekt selbst angewendet wird.

Sie können auch die Sicherheit des Verzeichnisses genau so festlegen, wie Sie es erstellen, da .NET genau für diesen Zweck eine Überladung bietet:

Directory.CreateDirectory(dir, security);

8
2018-04-11 17:24