Home Page Home Page Articoli Gestire le Access Control List (ACL) NTFS di file e directory con .NET

Gestire le Access Control List (ACL) NTFS di file e directory con .NET

Scopriamo come nel .NET Framework 2.0 sia diventato facile recuperare e modificare la lista controllo accessi dei file e directory e in generale come gestire le ACL.
Autore: Marco Caruso Livello:
Nella precedente versione del Framework se si voleva lavorare con l'ACL(Access Control List),lista controllo accessi) di file e directory bisognava per forza ricorrere all'utilizzo delle API di Windows, quindi con maggior difficoltà di implementazione per chi conosce poco, il vasto mondo dell'API di Windows.
Con la versione 2.0 del .NET Framework adesso possiamo lavorare con le ACL di file e directory direttamente con codice managed tramite il namespace System.Security.AccessControl.

Questo Namespace ha moltissime classi per lavorare con il controllo degli accessi ma in questo articolo prenderemo in esame le classi FileSecurity e DirectorySecurity che sono le classi predisposte proprio alla sicurezza rispettivamente di File e Directory.

Premessa


Per poter recuperare e impostare la sicurezza di file e directory bisogna avere l'hard disk impostato con una partizione NTFS (NT File System) altrimenti non si potrà accedere a tali funzioni con una partizione per esempio FAT32. Se avete ancora una partizione di questo tipo FAT o FAT32 potete convertirla con il comando convert.exe.

Per capire meglio come funzionano queste classi prendiamo come esempio un file di testo presente sul mio pc che hai i seguenti utenti con i vari permessi:



Abbiamo i tre utenti: Administrator, Marco e System che hanno il controllo completo, mentre il gruppo Users ha solamente consentito i permessi Lettura ed Esecuzione.

Quindi proviamo da codice a recuperare questa lista di utenti e permessi.
Il codice seguente sarà in C# ma in allegato all'articolo troverete anche il codice in VB.NET.

Come detto prima dobbiamo riferirci al namespace System.Security.AccessControl e quindi faremo un using per utilizzare le sue classi e faremo anche uno using del namespace System.IO per lavorare con file e directory.

Recuperare le ACL


Come prima cosa dobbiamo avere un'istanza del file ed aprirlo in lettura e per fare questo useremo la classe FileStream come di seguito riportato:

Codice .NET n°1
using System.Security.AccessControl;
using System.IO;

string pathFile = (@"C:\Demo\testAcl.txt");
using(FileStream fs = new FileStream(pathFile,FileMode.Open,FileAccess.Read))
{

}


Tramite la keyword using (questa keyword è presente solo in C#) apro il FileStream. Il vantaggio dell'uso di using è che quando la risorsa non sarà necessaria e quindi andrà in out of scope sarà automaticamente distrutta (disposed).

All'interno dello using scrivo il seguente codice che serve a recuperare l'ACL del file testAcl.txt:
Codice .NET n°2
FileSecurity _fileSecurity = fs.GetAccessControl();
foreach (FileSystemAccessRule fsRule in
_fileSecurity.GetAccessRules(true,true,typeof(System.Security.Principal.NTAccount)))
{
Console.WriteLine("Utente:{0},Accesso:{1},Permessi:{2}",
fsRule.IdentityReference,
fsRule.AccessControlType,
fsRule.FileSystemRights);

}


Analizziamo il codice appena scritto.
Come prima cosa dobbiamo creare un'istanza della classe FileSecurity o lo facciamo attraverso il metodo GetAccessControl() del FileStream.

Codice .NET n°3
FileSecurity _fileSecurity = fs.GetAccessControl();


Una volta ottenuta un'istanza della classe FileSecurity eseguo un ciclo ForEach per recuperare tutti i permessi utilizzando il metodo GetAccessRules().
Il metodo GetAccessRules espone tre parametri:

1. includeExplicit se true include tutte le regole di accesso impostate esplicitamente
2. includeInherit se true eredita tutte le regole di accesso dal padre
3. TargetType il tipo di indentità di sicurezza per il quale bisogna recuperare le regole.

Nel nostro caso il terzo parametro è un NTAccount che rappresenta un'utente o un Gruppo di dominio.

Una voltra ottenuta un'istanza del classe FileSystemAccessRule possiamo recuperare:

1. Identità(utente o gruppo) fsRule.IdentityReference
2. Tipo di accesso fsRule.AccessControlType
3. Permessi fsRule.FileSystemRights

Tramite il codice appena scritto avremo in output le seguenti regole di accesso:



Allo stesso modo dei file possiamo accedere alle regole di accesso delle directory utilizzando la classe DirectorySecurity:

Codice .NET n°4
DirectoryInfo _dirInfo = new DirectoryInfo(path);
DirectorySecurity _dirSecurity = _dirInfo.GetAccessControl();
foreach (FileSystemAccessRule fsRule in
_dirSecurity.GetAccessRules(true,true,typeof(System.Security.Principal.NTAccount)))
{
Console.WriteLine("Utente:{0},Accesso:{1},Permessi:{2}",
fsRule.IdentityReference,
fsRule.AccessControlType,
fsRule.FileSystemRights);
}


Modificare le ACL


Se invece vogliamo modificare le impostazioni esistenti per esempio vogliamo negare la scrittura al gruppo Users dobbiamo scrivere il seguente codice:

Codice .NET n°5
using (FileStream fs = new FileStream(filePath, FileMode.Open,   FileAccess.ReadWrite))
{
FileSecurity _fileSecurity = fs.GetAccessControl();
FileSystemAccessRule _fsRule = new FileSystemAccessRule("BUILTIN\\Users",
FileSystemRights.Write,
AccessControlType.Deny);

_fileSecurity.AddAccessRule(_fsRule);
File.SetAccessControl(filePath, _fileSecurity);
}


Come nell'esempio di prima utilizzeremo la classe FileStream per aprire il file ma questa volta utilizzeremo l'opzione ReadWrite dell'enumeration FileAccess, perchè bisogna modificare il file.

Come prima istanziamo la classe FileSecurity e poi andiamo a creare la nostra regola di accesso tramite la classe FileSystemAccessRule e gli definiamo:

• Account "BUILTIN\USERS" (in C# il carattere \ è un carattere di escape quindi và raddoppiato \\)
• La regola da impostare FileSystemRigths.Write
• Il tipo di controllo da impostare che può essere Allow o Deny.

Una volta creata la regola bisogna aggiungerla all'istanza della classe FileSecurity:

Codice .NET n°6
fileSecurity.AddAccessRule(_fsRule);


Poi per salvare le impostazioni bisogna richiamare il metodo SetAccessControl della classe File. Se invece vogliamo rimuovere una regola basta richiamare il metodo:

Codice .NET n°7
_fileSecurity.RemoveAccessRule(_fsRule);


Oppure se vogliamo rimuovere tutte le ACL per un determinato account basta richiamare il metodo RemoveAccessRuleAll().

Lavorando sulle ACL in modo più approfondito è possibile raggiungere un livello di controllo e di sicurezza ben più elevato rispetto allo standard normale. Se vogliamo dare accessi a file e/o cartelle ad account già esistenti come il famigerato ASPNET si può fare così:

Codice .NET n°8
FileSystemAccessRule _fsRule = new FileSystemAccessRule(new System.Security.Principal.NTAccount(“Caruso\\ASPNET”),
FileSystemRights.Read | FileSystemRights.Write,
AccessControlType.Allow);


Questo è un esempio comune e utile per chi programma Web Application in ASP.NET. Infatti spesso è necessario dare diritti di Modifica alla cartella contentente i database di Access. Ricordo che per IIS 5.0/5.1 l'utente a cui dare i diritti è ASPNET mentre su IIS 6.0 e quindi Windows 2003 l'utente è NETWORK SERVICE.

Conclusioni


L'utilizzo di queste classi per la gestione delle ACL credo sia molto importante per chi lavora normalmente con file e directory, ma in particolare riveste una particolare rilevanza l'esplorazione e la conoscenza del namespace Security.AccessControl che ha molteplici classi per varie soluzioni.
Voto medio articolo: 5.0 Numero Voti: 2

File allegati


ACL.zip (1 Kbyte)
Marco Caruso

Marco Caruso

Consulente Informatico di Roma, inizia la sua carriera nel 2000 utilizzando la tecnlogia Lotus Notes e il server Domino. Alla fine del 2001 passa alla piattaforma Microsoft.NET dove si appassiona sempre più a questa nuova tecnlogia. Importanti progetti a livello Enterprise per grandi società lo portano a cono... Profilo completo

Articoli collegati

Importare dati di Excel con .NET tramite ODBC o OLEDB e Drag & Drop
Spesso in ambito aziendale è necessario adattare le proprie applicazioni e consentire che possano leggere e operare su file e dati provenienti dai tools della suite di Office fra cui uno dei più usati è Excel. Vediamo quindi come importare dati da file XLS tramite ODBC/OLEDB e Drag & Drop.
Autore: Marco Farina | Difficoltà:
Costruire un client FTP usando il .NET Framework 2.0
In questo articolo tratteremo una delle novità più attese del .NET Framework 2.0, le classi per l'utilizzo del protocollo FTP. Realizzeremo un mini client FTP con alcune fra le funzionalità più comuni.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 28
Alla scoperta di WMI, questo sconosciuto
WMI o Windows Management Instrumentation è un componente fondamentale del sistema operativo Windows. La sua utilità è permettere l'accesso a informazioni fondamentali del sistema, come informazioni sull'hardware, software, servizi, ecc. Vediamo come sfruttarlo con .NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2
Gestire e sfruttare i campi BLOB usando .NET
I database server sono software con una potenza elevata e offrono una vasta gamma di features che spesso non vengono utilizzate. Una di queste sono i campi BLOB (campi per contenere dati in formato binario). Vediamo in questo articolo come utilizzarli con .NET.
Autore: David De Giacomi | Difficoltà: | Commenti: 13
Catturare immagini da una Webcam con .NET
In questo articolo mostreremo come è possibile costruire una applicazione per catturare immagini da una Webcam, utilizzando componenti già presenti in Windows, in questo caso l' Avicap32.dll
Autore: Giovanni Ferron | Difficoltà: | Commenti: 22 | Voto:
Usare il protocollo POP3 per creare un Client di posta
Volete costruirvi un client di posta? Volete costruire una Web Mail ? Ecco un articolo che vi introduce al protocollo POP3 e vi insegna come costruire un mini client di posta elettronica.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2 | Voto:
La stampa di una Win Form
Vedremo in questo articolo i passi necessari per creare una stampa sia di testo che di grafica di una WinForm attraverso .NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 9 | Voto:
Creare un Setup di un progetto con Visual Studio .NET
Ecco delle semplici ma dettagliate istruzioni passo-passo per costruire un pacchetto di Setup (Setup Package) per le nostre Applicazioni WinForms.
Autore: Marco Caruso | Difficoltà: | Commenti: 18
Creare un?icona nella Taskbar di Windows con .NET
Scoprirete come potenziare la vostra applicazione aggiungendo un'icona nella barra di Windows nella famosa Tray Area a fianco dell'orologio del sistema. Disponibile sia codice VB.NET che C#.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 1 | Voto:
Costruire un Servizio di Windows usando .NET
Un avanzato tutorial che vi spiegherà passo passo e in modo dettagliato le istruzioni per costruire un Servizio Windows, utilizzando ciò che il .NET Framework ci mette a disposizione. Disponibile sia codice C# che VB.NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 13 | Voto:
Windows XP Visual Styles con .NET e Win Forms
Come usare lo stile XP nelle vostre applicazioni .NET ? Questo articolo vi spiega come applicare a Buttons, Textbox, ListViews (ai controlli di Windows in genere) lo stile/tema grafico della GUI introdotto dal sistema operativo Windows XP.
Autore: David De Giacomi | Difficoltà: | Commenti: 7
Come sfruttare le funzioni di una DLL unmanaged esterna creata in C/C++
Come usare la classe DllImportAttribute messa a disposizione dal namespace System.Runtime.InteropServices per sfruttare le funzioni di una DLL unmanaged Win32 old-style scritta con Visual C++ 6.0
Autore: David De Giacomi | Difficoltà: | Commenti: 4 | Voto:
Creare una DLL in Visual C++ 6.0
Vedremo in questo articolo come creare una Dynamic Link Link Library, comunemente chiamata DLL con Visual C++ 6.0. Questo passo è necessario per poi dimostrare l'utilizzo di librerie C/C++ in .NET tramite il package System.Runtime.InteropServices
Autore: David De Giacomi | Difficoltà: | Commenti: 11 | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5