2009-09-11 8 views
6

Ho riscontrato problemi nell'assegnazione delle autorizzazioni alle cartelle/voci del Registro di sistema in modo programmatico. Sono riuscito ad assegnare ereditare le autorizzazioni utilizzando il seguente codice:C# - ACL di Windows - Applicazione di autorizzazioni ereditate

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

Questa imposta correttamente i miei permessi dei file su tutte le cartelle figlio creo come amministratore. Tuttavia, non imposta le autorizzazioni sulla cartella dir stessa. Ho giocato con una discreta permutazione per ereditarietà e propaganda, ma non ho avuto alcuna gioia.

Per esempio, io ho:

dir = %programfiles%\Test 

Se ho creato una cartella in prova (%programfiles%\Test\SubFolder), ho autorizzazioni complete assegnate ad esso per il mio utente, ma non hanno autorizzazioni complete su %programfiles%\Test. Questo è davvero fastidioso, dato che mi piacerebbe dare ai miei utenti permessi completi per fare qualsiasi cosa con la directory Test.

Ho problemi simili con le autorizzazioni di registro, ma credo che se riesco a risolverne uno, posso risolvere entrambi i problemi in sospeso.

Qualcuno sa come questo può essere risolto?

Regards
Tris

+0

SubFolder è un oggetto figlio di prova in modo che eredita le regole di prova , Non il contrario. Hai provato a creare l'ACL in Test? –

risposta

14

Per la cartella:

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

Per sottocartelle e file:

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

entrambe le linee hanno bisogno di essere nel progetto. quindi ottieni acl che si applicano a questa cartella, sottocartelle e file

+0

bello, grazie! –

7

Non sono un esperto qui, ma dopo averlo scoperto per i miei scopi, credo che la risposta di Dave, sebbene funzionale, sia eccessivamente complicata. Si dovrebbe essere in grado di raggiungere questo obiettivo con una sola regola:

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

Il parametro PropagationFlags.InheritOnly utilizzato dal PO nel loro codice originale è ciò che impedisce la regola di accesso da applicare all'oggetto stesso.

Inoltre, si potrebbe anche impostare la protezione della directory come si sta creando, dal momento NET fornisce un sovraccarico solo per tale scopo:

Directory.CreateDirectory(dir, security); 
Problemi correlati