Esistono numerosi tool (tra i quali secondo me il
migliore è xcacls, qui nella versione scripting) che
permettono di lavorare con i permessi NTFS.
Un'altra
strada possibile è quella di utilizzare WMI
per accedere a questo tipo di informazioni.
Il piccolo script qui sotto
mostra l'utilizzo della classe Win32_LogicalFileSecuritySetting
per scoprire
quali sono gli utenti e i permessi associati ad una determinata cartella (o
file):
public void MostraACL(string Path)
{
using (ManagementObject mob = new ManagementObject("root\\CIMV2", "Win32_LogicalFileSecuritySetting.Path='" + Path + "'", null))
{
//eseguo il metodo GetDescriptor per ottenere gli elementi
object[] obs = new object[] { 0 };
ManagementBaseObject mbase = (ManagementBaseObject)mob.InvokeMethod("GetSecurityDescriptor", null, null);
//controllo che esistano dei valori
if (((uint)(mbase.Properties["ReturnValue"].Value)).Equals(0))
{
ManagementBaseObject desc = (ManagementBaseObject)(mbase.Properties["Descriptor"].Value);
ManagementBaseObject[] ACL = ((ManagementBaseObject[])(desc.Properties["Dacl"].Value));
//vediamo quali sono i permessi della cartella..
foreach (ManagementBaseObject mba in ACL)
{
//Dominio, Utente e SID
ManagementBaseObject IUSR = ((ManagementBaseObject)(mba["Trustee"]));
Console.WriteLine("==================================");
/* Mostro Dominio\Utente : Sid */
Console.WriteLine("{0}\\{1} : {2}", IUSR.Properties["Domain"].Value, IUSR.Properties["Name"].Value, IUSR.Properties["SIDString"].Value);
/* Mostro i permessi */
uint m = (uint)mba["AccessMask"];
Console.WriteLine(":" + Enum.Format(typeof(Mask), m, "G"));
/* Mostro la tipologia di permesso*/
int a = int.Parse(mba["AceFlags"].ToString());
Console.WriteLine(":" + Enum.Format(typeof(AceFlags), a, "G"));
Console.WriteLine("==================================");
}
Console.Read();
}
}
}
Maggiori informazioni sulle classi Win32_LogicalFileSecuritySetting >
powered by IMHO 1.3