2009-01-09 15 views
16

Piszę aplikację do zarządzania dostępem użytkowników do plików. Krótka wersja bardzo długiej historii polega na tym, że muszę użyć katalogu i plików, aby to zrobić. Brak systemu zarządzania dokumentami dla naszego taniego CEO ...C# Uprawnienia do plików/katalogów

W każdym razie ... Mam wszystko działa, z wyjątkiem przypadku, gdy użytkownik może zobaczyć, które pliki są w katalogu, ale nie widzą jego zawartości. (W plikach mogą znajdować się wrażliwe dane HR).

Próbowałem FileSystemRights.ListDirectory, ale wydaje się, że (dispite dokumentacja MS) ustaw również ReadData na true. Wyłączam ReadData (możliwość odczytu plików) i nagle nie mam już dostępu do katalogu. Te dwa elementy są połączone.

Wszelkich pomysłów, dla których pozwolenie (i) ustawić, aby to osiągnąć?

Mój obecny kod jest:

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); 
} 

Dzięki.

--Jerry

Odpowiedz

7

FileSystemRights wyliczenia odwzorowuje zarówno ReadData i ListDirectory na wartość 1, co zapewnia ich 100% równoważne miarę NET dotyczy.

Czy wypróbowałeś Traverse w przeciwieństwie do ListDirectory?

Edycja: Na podstawie artykułu this KB wydaje się, że Windows XP uważa, że ​​są one również takie same, tylko jedna dotyczy tylko plików, a jedna dotyczy tylko katalogów.

Edycja 2: Tak długo, jak ustawisz regułę dostępu ReadData/ListDirectory jako NIE dziedziczoną przez obiekty podrzędne, powinieneś być w stanie zastosować ją do katalogu bez stosowania jej do plików w katalogu. Klasa FileSystemAccessRule obsługuje zmianę flag dziedziczenia.

3

Pliki prawdopodobnie dziedziczą właściwości zabezpieczeń od nadrzędnego.

Możesz spróbować wywołać DirectorySecurity.SetAccessRuleProtection(true, false), aby zapobiec dziedziczeniu plików, przed wywołaniem Directory.SetAccessControl();

+0

Tak. Pliki dziedziczą z folderu. Kolejny "dyrektor generalny odmawia zakupu rozwiązania prawdziwego rozwiązania do zarządzania dokumentami", które musimy ustawić. – Jerry

+0

Po przetestowaniu bez dziedziczenia w określonym folderze, masz rację. Możesz włączyć folder, a następnie wyłączyć sam plik i działa zgodnie z oczekiwaniami ... ale z innych powodów nie jest to opcja dla nas. – Jerry

1

Tak. Traverse (chyba źle nazwany) pozwala mi na wykonanie programu w folderze, ale NIE wyświetla zawartości folderu. Nie jestem pewien, dlaczego to jest przydatne, szczerze mówiąc.

Zaraz poinformuję dyrektora naczelnego, że nie da się tego zrobić i obserwować, jak iskry znów fruwają. : P

+2

Możliwość pominięcia sprawdzania przechodzenia zapewnia dostęp do pliku O (1) zamiast O (n). Wyobraź sobie, że próbujesz otworzyć 100 plików zagnieżdżonych w 12 katalogach. Jeśli możesz pominąć sprawdzanie ciągu, musisz wykonać tylko 100 kontroli ACL; jeśli nie, musisz zrobić 1200 czeków. – Gabe

0

To wartości spadków i rozmnażania, które nie są ustawione, gdy FileSystemAccessRule jest instancja ..