2012-04-10 15 views
6

Piszę małe narzędzie w języku C#, aby upewnić się, że określony folder i cała jego zawartość mają odpowiednie prawa dostępu (chcę dać grupie pełny dostęp do grupy Authenticated Users). Poniższy kod wydaje się działać poprawnie za aktualizowanie ACL folderu najwyższego poziomu użytkownika (Access Control List):Jak sprawdzić, czy "włącz dziedziczne uprawnienia" nie jest zaznaczone dla pliku lub folderu?

SecurityIdentifier allUsers = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 
InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 
FileSystemAccessRule newRule = new FileSystemAccessRule(allUsers, 
    FileSystemRights.FullControl, iFlags, 
    PropagationFlags.None, AccessControlType.Allow); 

DirectoryInfo info = new DirectoryInfo(folderPath); 
DirectorySecurity security = info.GetAccessControl(); 
security.AddAccessRule(newRule); 
info.SetAccessControl(security); 

Zauważyłam jednak, że ta nowa zasada dostępu nie rozprzestrzeniać do podfolderów, które mają „Dołącz dziedziczne uprawnienia ... "Opcja niezaznaczona we właściwościach zabezpieczeń. To ma sens. Tak, więc chcę przywrócić dziedziczenie uprawnień bezpieczeństwa dla wszystkich takich podfolderów.

Moje kopanie odkryło metodę ObjectSecurity.SetAccessRuleProtection, która powinna być połową tego, czego potrzebuję. Wydaje się jednak, że niechlujnie stosuje się powyższą metodę do obiektów, które już dziedziczą DACL swoich rodziców. Tak więc chcę ustalić, które obiekty mają wyłączone uprawnienia dziedziczenia, ale nie mogę znaleźć odpowiedniej metody lub właściwości, która zwraca tę informację. Czy jest jeden? Czy coś mi umyka?

+0

Dlaczego to ma znaczenie, czy folder nadrzędny ma już to ustawić? Ponowne ustawienie go nie powinno wywoływać żałoby. –

+0

@ M.Babcock - Z powodów praktycznych wydaje się marnotrawstwem i nieefektywnością wymuszenie aktualizacji pliku lub folderu, który nie wymaga aktualizacji. W moim konkretnym przypadku istnieje tylko kilka podfolderów, które * nie * dziedziczą praw dostępu, ale istnieją setki, a nawet tysiące plików w tych samych folderach, które * robią *. Ze względów wydajności raczej chciałbym zaktualizować garść tych obiektów niż wszystkie. – Jeremy

+1

Chociaż nie jest to duplikat, jest to odwrotnością http://stackoverflow.com/questions/6574196/programatically-removing-include-heritable-pestications-from-thisobjects-par – emd

Odpowiedz

4

Pamiętam za pomocą czegoś takiego:

ja też próbuje znaleźć sposób, aby to sprawdzić, ale nie mogłem znaleźć żadnego (nawet w C++). Więc skończyło się na użyciu powyższego kodu. To działało jak czar.

+0

Wygląda na to, że MS nie ma Zapewnij bardziej bezpośrednią metodę sprawdzenia tego, ale tego właśnie szukałem. :) – Jeremy

+1

Twój przykład pokazuje tylko "jeśli threre jest czymś odziedziczonym" i "nie pokazuje, czy dziedziczenie jest włączone". Jest to różnica, gdy folder nadrzędny propaguje prawa tylko do folderu nadrzędnego (a nie do podfolderów lub plików) lub gdy akl jest uszkodzony. W obu przypadkach otrzymasz "brak dziedziczenia nawet po włączeniu". – boboes

1

Wydaje się, że jest zarządzane sposobem, aby to zrobić:

DirectorySecurity ds = System.IO.Directory.GetAccessControl(@"C:\test"); 
byte[] rawBytes = ds.GetSecurityDescriptorBinaryForm(); 
RawSecurityDescriptor rsd = new RawSecurityDescriptor(rawBytes, 0); 

if ((rsd.ControlFlags & ControlFlags.DiscretionaryAclProtected) == 
         ControlFlags.DiscretionaryAclProtected) 
{ 
    // "Include inheritable permissions from this object's parent" is unchecked 
} 
else 
{ 
    // "Include inheritable permissons from this object's parent" is checked 
} 
Powiązane problemy