2012-04-10 7 views
6

Sto scrivendo una piccola utility in C# per assicurarmi che una cartella specificata e tutti i suoi contenuti abbiano i diritti di accesso appropriati (voglio dare al gruppo Authenticated Users pieno accesso). Il seguente codice sembra funzionare correttamente per l'aggiornamento ACL nella cartella principale del livello (Access Control List):Come verificare se "include autorizzazioni ereditabili" è deselezionato per un file o una cartella?

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

Ho notato, tuttavia, che questa nuova regola di accesso non si propaga alle sottocartelle che hanno il "Includi autorizzazioni ereditabili ... "opzione deselezionata nelle relative proprietà di sicurezza. Questo ha senso solo Quindi, quello che voglio fare è riattivare l'ereditarietà delle autorizzazioni di sicurezza per tali sottocartelle.

Il mio scavo ha scoperto il metodo ObjectSecurity.SetAccessRuleProtection che dovrebbe essere la metà di quello che mi serve. Tuttavia, sembra sciatto utilizzare solo il metodo sopra per gli oggetti che già ereditano il DACL dei loro genitori. Pertanto, voglio determinare quali oggetti hanno disattivato l'ereditarietà delle autorizzazioni, ma non riesco a trovare il metodo o la proprietà corrispondente che restituisce queste informazioni. Ce n'è uno? Mi sto perdendo qualcosa qui?

+0

Perché è importante se una cartella padre già lo ha stabilito? L'impostazione di nuovo non dovrebbe causare alcun dolore. –

+0

@ M.Babcock - Per motivi pratici, sembra inutile e inefficiente forzare un aggiornamento a un file o una cartella che non necessita di aggiornamento. Nel mio caso specifico, ci sono solo alcune sottocartelle che * non * ereditano i diritti di accesso, ma ci sono centinaia o addirittura migliaia di file all'interno delle stesse cartelle che * fanno *. Per motivi di prestazioni, preferirei piuttosto aggiornare una manciata di questi oggetti rispetto a tutti loro. – Jeremy

+1

Sebbene non sia un duplicato, è l'inverso di http://stackoverflow.com/questions/6574196/programatically-removing-include-inheritable-permissions-from-this-objects-par – emd

risposta

4

mi ricordo utilizzando qualcosa di simile:

stavo anche cercando di trovare un metodo per verificare la presenza di questo, ma non ho potuto trovare qualsiasi (anche in C++). Così ho finito per usare il codice sopra. Ha funzionato come un fascino.

+0

Sembra una svista da MS a non fornire un metodo più diretto per verificare questo, ma questo è esattamente quello che stavo cercando. :) – Jeremy

+1

L'esempio mostra solo "se threre è qualcosa di ereditato" e "non mostra se l'ereditarietà è attivata". Questa è una differenza quando la cartella principale fa propagare i diritti solo alla cartella principale (e non alle sottocartelle o ai file) o quando l'acl è corrotto. In entrambi i casi non avrai "nessuna eredità neanche quando è accesa". – boboes

1

Sembra che ci sia un modo riuscito a fare questo:

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 
} 
Problemi correlati