2012-09-10 13 views
5

Stavo cercando di concedere autorizzazioni NTFS su un percorso UNC per un utente specifico, ma vedo un comportamento diverso a seconda del percorso UNC. Di seguito è riportato il codice (da MSDN), che sto usando per concedere le autorizzazioni e il risultato in ogni scenario,Autorizzazioni ereditate perse con autorizzazioni NTFS

static void GiveNTFSPermissions(string folderPath, 
           string ntAccountName, 
           FileSystemRights accessRights) 
{ 
    DirectorySecurity dirSecurity = Directory.GetAccessControl(folderPath); 

    FileSystemAccessRule newAccessRule = 
     new FileSystemAccessRule(
       ntAccountName, 
       accessRights, 
       AccessControlType.Allow); 

    dirSecurity.AddAccessRule(newAccessRule); 

    Directory.SetAccessControl(folderPath, dirSecurity); 
} 

Supponiamo che ho una condivisione denominata “RootShare” sulla mia macchina locale, e un'altra cartella “InsideRootShare "al suo interno.

Scenario1: Quando chiamo,

GiveNTFSPermissions(@"\\sri-devpc\RootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

autorizzazioni ereditate sono stati persi sul percorso condiviso,

Scenario2: Quando chiamo,

GiveNTFSPermissions(@"\\sri-devpc\RootShare\InsideRootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

Le autorizzazioni ereditate erano intatte.

Ho provato con diversi costruttori di FileSystemAccessRule ma senza fortuna.

Qual è la causa di questo comportamento e una soluzione alternativa?

+0

Hai provato il [costruttore] (http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule.aspx) che accetta "InheritanceFlags" come argomento? Inoltre, 'AddNTFSPermission' è un nome più ragionevole di' GiveNTFSPermissions', poiché tenta di * aggiungere * una nuova regola di accesso alle regole di accesso esistenti. – Nawaz

+0

Vedere questo argomento: http://stackoverflow.com/questions/243995/setting-folder-permissions-on-vista – Nawaz

+0

@Nawaz: Ho provato tutti i costruttori e ho lo stesso risultato. Grazie per il suggerimento :) – sri

risposta

4

Abbiamo riscontrato problemi simili durante il lavoro con il modulo di sicurezza di Dropkick. La soluzione che abbiamo trovato è la seguente. Ciò imposterà correttamente le autorizzazioni su qualsiasi cartella senza modificare le regole di ereditarietà nella cartella.

public void SetFileSystemRights(string target, string group, FileSystemRights permission) 
    { 
     if (!IsDirectory(target) && !IsFile(target)) 
      return; 

     var oldSecurity = Directory.GetAccessControl(target); 
     var newSecurity = new DirectorySecurity(); 

     newSecurity.SetSecurityDescriptorBinaryForm(oldSecurity.GetSecurityDescriptorBinaryForm()); 

     var accessRule = new FileSystemAccessRule(group, 
                permission, 
                InheritanceFlags.None, 
                PropagationFlags.NoPropagateInherit, 
                AccessControlType.Allow); 
     bool result; 
     newSecurity.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

     if (!result) Log.AddError("Something wrong happened"); 

     accessRule = new FileSystemAccessRule(group, 
               permission, 
               InheritanceFlags.ContainerInherit | 
               InheritanceFlags.ObjectInherit, 
               PropagationFlags.InheritOnly, 
               AccessControlType.Allow); 

     result = false; 
     newSecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out result); 
     if (!result) Log.AddError("Something wrong happened"); 

     Directory.SetAccessControl(target, newSecurity); 

     if (result) Log.AddGood("Permissions set for '{0}' on folder '{1}'", group, target); 

     if (!result) Log.AddError("Something wrong happened"); 
    } 

Trovato the link that I originally used to figure this out.