per diletto e uso personale ho sviluppato un piccolo (ormai mica troppo piccolo) software per sincronizzare il contenuto di 2 o più cartelle tra PC diversi, siano essi in rete locale o ad esempio accessibili via FTP o chi più ne ha più ne metta :-D, facendo qualche test su Windows Vista per verificarne la compatibilità mi sono imbattuto nei Junction Point, in breve i Junction Point sono delle sorte di place holder per garantire la compatibilità con le applicazini legacy, la necessità nasce dal fatto che in Vista la pozione di molte cartelle di sistema è cambiata, ad esempio i profili utente non sono più in "%SystemDrive%\Documents & Settings" ma ora sono in "%SystemDrive%\Users" oppure le cartelle "My Pictures" e "My Music" non sono più all'interno di "My Documents" ma ora sono direttamente figlie della cartella del profilo utente.

I Junction Point risolvono questo problema permettendo alle applicazioni che si aspettano di trovare un certo "Path" di continuare ad attraversarlo accedendo però alla risorsa nella nuova posizione. Ho sottolinato attraversare perchè di default nelle ACL di un Junction Point i permessi per Everyone sono Deny Read inoltre sembra che l'unica possibilità per un'applicazione sia quella di avere i permessi per "Traverse Folder", quindi non dovrebbe essere possibile enumerare il contenuto di un junction point.

Da notare quindi che per led applicazioni legacy i permessi devono essere comunque esplicitamente abilitati.

In effetti questo è proprio il problema in cui mi sono imbattuto, il sistema per distinguere se l'oggetto che abbiamo in mano è un junction point è verificare che negli attributi sia marcato come ReparsePoint e System (in contemporanea), programmaticamente la cosa è molto semplice, un esempio semplice semplice è il seguente:

foreach( DirectoryInfo sd in myDir.GetDirectories() )
{
    Boolean isReparsePoint = ( sd.Attributes & FileAttributes.ReparsePoint ) == FileAttributes.ReparsePoint;
    Boolean isSystem = ( sd.Attributes & FileAttributes.System ) == FileAttributes.System;

    if( !isReparsePoint && !isSystem )
    {
        //Access granted...
    }
}

.m