Per copiare i permessi di cartelle e file in ambiente .NET è possibile senza utilizzare chiamate esterne, ma con 6 righe di commando.

Iniziando acquisendo gli oggetti “FileInfo” per il file di partenza e destinazione:

'File sorgente per i privilegi
Dim flSrc As New FileInfo(strSrc)
'File di destinazione dei permessi
Dim flDest As New FileInfo(strDest)

Acquisiamo ora il descrittore dei permessi per il file di origine e di destinazione:

'Descrittore di protezione per il file di origine
Dim flACLOr As System.Security.AccessControl.FileSecurity = _
    flSrc.GetAccessControl(Security.AccessControl.AccessControlSections.All)
'Descrittore di protezione per il file di destinazione
Dim flACLDs As System.Security.AccessControl.FileSecurity = _
    flDest.GetAccessControl(Security.AccessControl.AccessControlSections.All)

Per copiare il descrittore dei permessi, dobbiamo utilizzare la rappresentazione binaria del descrittore di partenza e impostarla nel descrittore di destinazione:

'Imposto nell'ACL di destinazione la rappresentazione binaria dell'ACL di partenza
flACLDs.SetSecurityDescriptorBinaryForm(flACLOr.GetSecurityDescriptorBinaryForm)
'Riassegno l'ACL nel file di destinazione per salvarne i dati
flDest.SetAccessControl(flACLDs)

Questo sistema è quello suggerito da Microsoft, ed è quello che effettivamente funziona.

Visto che il sistema delle cartelle è perfettamente identico, cambia solo il tipo di oggetti. Riporto quindi il codice per le cartelle senza illustrarne le sezioni:

'Cartella sorgente per i privilegi
Dim drSrc As New DirectoryInfo(strSrc)
'Cartella di destinazione dei permessi
Dim drDest As New DirectoryInfo(strDest)
'Descrittore di protezione per la cartella di origine
Dim drACLOr As System.Security.AccessControl.DirectorySecurity = _
    drSrc.GetAccessControl(Security.AccessControl.AccessControlSections.All)
'Descrittore di protezione per la cartella di destinazione
Dim drACLDs As System.Security.AccessControl.DirectorySecurity = _
    drDest.GetAccessControl(Security.AccessControl.AccessControlSections.All)
'Imposto nell'ACL di destinazione la rappresentazione binaria dell'ACL di partenza
drACLDs.SetSecurityDescriptorBinaryForm(drACLOr.GetSecurityDescriptorBinaryForm)
'Riassegno l'ACL nella cartella di destinazione per salvarne i dati
drDest.SetAccessControl(drACLDs)

Per dubbi sulle singole funzioni rimando alla guida Microsoft MSDN. Il sistema funziona ovviamente con tutti i linguaggi compatibili con il framework .Net di Microsoft.

NOTA: i comandi sono stati testati con il framework 2.0 e 3.5