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", 
nullnull);

                
//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