2009-01-09 3 views
16

Ich schreibe eine Anwendung, um den Benutzerzugriff auf Dateien zu verwalten. Die kurze Version einer sehr langen Geschichte ist, dass ich dazu Verzeichnis- und Datei-Privilegien verwenden muss. Kein Dokumentenverwaltungssystem für unseren billigen CEO ...C# Datei-/Verzeichnisberechtigungen

Wie auch immer ... Ich habe alles funktioniert außer dem Fall, wo der Benutzer sehen kann, welche Dateien im Verzeichnis sind, aber nicht den Inhalt der Datei tatsächlich sehen. (Es kann empfindliche HR-Daten in den Dateien geben.)

Ich versuchte FileSystemRights.ListDirectory, aber das scheint (trotz MS-Dokumentation) ReadData auf True setzen. Ich deaktiviere ReadData (die Fähigkeit, die Dateien zu lesen) und habe plötzlich keinen Zugriff mehr auf das Verzeichnis. Die beiden erscheinen verknüpft.

Irgendwelche Ideen für welche Erlaubnis (en), um dies zu erreichen?

Mein aktueller Code ist:

SetSecurity(pth, usr, FileSystemRights.ListDirectory, AccessControlType.Allow); 

... 

public void SetSecurity(string dirName, string account, 
    FileSystemRights rights, AccessControlType controlType) 
{ 
    // Get a FileSecurity object that represents the 
    // current security settings. 
    DirectorySecurity dSecurity = Directory.GetAccessControl(dirName); 

    dSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType)); 

    // Set the new access settings. 
    Directory.SetAccessControl(dirName, dSecurity); 
} 

Dank.

--Jerry

Antwort

7

Die FileSystemRights enum abbildet sowohl Readdata und Listdirectory auf den Wert 1, so sind die beiden 100% entspricht so weit wie .NET betrifft.

Haben Sie versucht, Traverse im Gegensatz zu ListDirectory?

Edit: Basierend auf this KB Artikel scheint es, dass Windows XP hält sie für die gleichen, nur eins gilt nur für Dateien, und man gilt nur für Verzeichnisse.

Edit 2: Solange Sie die ReadData/ListDirectory-Zugriffsregel so einstellen, dass sie NICHT von untergeordneten Objekten geerbt wird, sollten Sie sie auf das Verzeichnis anwenden können, ohne sie auf die Dateien im Verzeichnis anzuwenden. Die FileSystemAccessRule-Klasse unterstützt die Änderung von Vererbungsflags.

3

Die Dateien erben wahrscheinlich die Sicherheitseigenschaften von Parent.

Sie können versuchen, DirectorySecurity.SetAccessRuleProtection(true, false) aufzurufen, um zu verhindern, dass die Dateien vererben, bevor Sie Directory.SetAccessControl() aufrufen;

+0

Ja. Die Dateien erben von dem Ordner. Ein weiteres "CEO weigert sich, eine echte Dokumentenmanagement-Lösung zu kaufen" -Problem, das wir haben müssen. – Jerry

+0

Nach dem Testen ohne Vererbung für einen bestimmten Ordner haben Sie Recht. Sie können den Ordner aktivieren, dann die Datei selbst deaktivieren und es funktioniert wie gewünscht ... aber aus anderen Gründen ist dies für uns keine Option. – Jerry

1

Ja. Traverse (ich denke, es ist falsch benannt) erlaubt mir, ein Programm in einem Ordner auszuführen, aber NICHT den Inhalt eines Ordners anzeigen. Nicht sicher, warum das nützlich ist, um ehrlich zu sein.

Ich bin im Begriff, dem CEO zu sagen, dass es nicht getan werden kann und die Funken wieder fliegen zu sehen. : P

+2

Durch die Möglichkeit, Traverschecks zu umgehen, wird der Dateizugriff O (1) anstelle von O (n) aktiviert. Stellen Sie sich vor, Sie versuchen, 100 Dateien zu öffnen, die 12 tiefe Verzeichnisse enthalten. Wenn Sie die Überprüfungsüberprüfungen umgehen können, müssen Sie nur 100 ACL-Überprüfungen durchführen. Wenn nicht, müssen Sie 1200 Schecks machen. – Gabe

0

Es ist die Vererbung und Ausbreitungswerte, die nicht gesetzt werden, wenn die FileSystemAccessRule instanziiert wird ..