Modifica delle ACL NTFS mediante PowerShell

Scenario Una macchina con a bordo Windows Server 2008 R2 che funge da Web server (IIS7).
Si vuole fare in modo che gli utenti possano effettuare l'upload (mediante un form opportunamente creato) di immagini e file di vario genere.
Problema Le ACL NTFS relative alla root directory di IIS (ovvero C:\inetpub\wwwroot) non consentono le operazioni di modifica agli utenti Web anonimi (appartenenti al gruppo IIS_IUSRS), ergo qualsiasi tentativo di upload avrà esito negativo.
Inoltre, l'alberatura delle sottodirectory è abbastanza complessa ed è qualcosa del tipo /nomesubdir/immagini, in cui nomesubdir è variabile (ce ne sono circa un migliaio), mentre immagini è la dir di destinazione degli upload (sulla quale bisogna garantire i permessi di modifica).
Soluzione La prima soluzione che viene in mente prevede per lo più tanta pazienza ed un lavoro certosino da attuare, fondamentalmente, in 2 passaggi: l'accesso manuale a ciascuna subdir e la modifica delle ACL NTFS per la directory immagini ivi contenuta.
La seconda soluzione è certamente più rapida e smart: creare uno scrip PowerShell in grado di modificare le suddette ACL per tutte le directory immagini poste all'interno delle subdir.
Ecco lo scrip: $Acl = Get-Acl "C:\inetpub\wwwroot\*\immagini" $Ar = New-Object  system.security.accesscontrol.filesystemaccessrule("IIS_IUSRS","Modify","ContainerInherit, ObjectInherit", "None","Allow") foreach($Ac in $Acl) {     $Ac.SetAccessRule($Ar)     Set-Acl "C:\inetpub\wwwroot\*\immagini" $Ac } Esso prevede, in soldoni, 2 fasi: la prima in cui vengono identificati i permessi relativi alla directory immagini presente in ciascuna subdir  (mediante la cmdlet Get-Acl); la seconda in vengono definiti i nuovi permessi per il gruppo IIS_IUSRS, applicandoli a tutte le  immagini (ed ai file in esse contenuti).
Rollback Naturalmente la modifica dei permessi NTFS associati a file e cartelle è sempre un'operazione abbastanza invasiva e delicata, ergo è opportuno garantirsi la possibilità di ripristinare la situazione iniziale (ovvero quella precedente alle suddette modifiche).
Ecco lo scrip in grado di effettuare il rollback dei permessi: $Acl = Get-Acl "C:\inetpub\wwwroot\*\immagini" $Ar = New-Object  system.security.accesscontrol.filesystemaccessrule("IIS_IUSRS","Modify","ContainerInherit, ObjectInherit", "None","Allow") foreach($Ac in $Acl) {     $Ac.RemoveAccessRuleAll($Ar)     Set-Acl "C:\inetpub\wwwroot\*\immagini" $Ac } La logica è sempre la stessa, l'unica variazione riguarda la funzione RemoveAccessRuleAll($Ar) che ha [...]

Leggi tutto l'articolo