Panoramica dell'API Bindlink
La libreria Bindlink consente agli utenti amministratori di associare uno spazio dei nomi del file system a un percorso virtuale locale tramite il filtro bind (mini filtro bindflt.sys). I collegamenti di associazione forniscono il reindirizzamento del file system da un percorso virtuale locale a un percorso di backup locale o remoto. Possono abilitare principalmente due tipi di scenari: per prima cosa, possono creare file remoti in una condivisione di rete che migliorano la compatibilità delle app e in secondo luogo consentono scenari in cui un'applicazione vuole che i file di posizioni diverse vengano visualizzati in una nuova posizione, potenzialmente con nomi e strutture di directory diverse, senza copiare i file. I collegamenti di binding sono trasparenti per le applicazioni e tutte le API esistenti funzionano senza conoscere questo reindirizzamento. Non viene creato alcun file fisico o directory per il percorso virtuale e i collegamenti di associazione estendono i descrittori di sicurezza e le autorizzazioni dei file e delle directory nel percorso di supporto al percorso virtuale.
Utilizzo
Il set di API è costituito da 2 funzioni correlate:
- CreateBindLink : questa API consente agli amministratori di creare un collegamento di associazione tra un percorso virtuale e un percorso di backup.
- RemoveBindLink : questa API consente a un utente di rimuovere un collegamento creato in precedenza chiamando CreateBindLink.
Per un uso di esempio di queste funzioni, vedere Esempi di Bindlink.
Creazione di collegamenti di associazione
I collegamenti di binding sono trasparenti per le applicazioni e, mentre questi collegamenti esistono, tutte le operazioni si applicano al percorso di backup. Di conseguenza, DeleteFile o RemoveDirectory agisce sul percorso di backup, eliminando in modo efficace il percorso di backup, ma non il collegamento. Questa API avrà esito negativo se l'utente non dispone di privilegi Amministrazione istrator, se l'utente non dispone delle autorizzazioni per aprire il percorso virtuale o il percorso di backup, se il percorso di backup non esiste, se esiste un altro collegamento per il percorso virtuale o se si verifica un errore interno durante la configurazione del collegamento. In particolare, l'utente amministratore deve essere in grado di allegare il filtro (autorizzazioni per FilterAttach), connettersi alla porta del filtro (autorizzazioni per Filter Connessione CommunicationPort) e accedere alla radice del percorso di backup o altrimenti l'API avrà esito negativo con ERROR_ACCESS_DENIED.
Se un'app tenta di seguire il collegamento a un percorso di backup eliminato dopo la configurazione del collegamento, l'app visualizzerà ERROR_FILE_NOT_FOUND*. In un secondo momento, se il percorso di backup viene creato di nuovo, il collegamento verrà applicato a questo nuovo percorso di backup. Se un file dovesse essere creato in virtualPath mentre esiste il collegamento, verrà visualizzato in virtualPath se il collegamento esiste ma viene creato fisicamente nel percorso di backup. Quando il collegamento viene rimosso, il file viene visualizzato solo nel percorso di backup e non viene più visualizzato in virtualPath. Questo vale per tutti i tipi di collegamenti descritti di seguito.
A seconda che il percorso virtuale sia presente su disco, il collegamento risultante sarà un collegamento senza ancoraggio o un collegamento shadow.
Collegamenti senza ancoraggio
I collegamenti senza ancoraggio sono collegamenti di associazione creati quando il percorso virtuale non esiste sul disco prima della creazione del collegamento. Quando viene creato questo tipo di collegamento, il percorso virtuale viene sintetizzato in memoria e viene visualizzato come un percorso normale nel file system. Si noti che per creare un collegamento di associazione di questo tipo, l'elemento padre del percorso virtuale deve esistere come directory su disco o come collegamento creato in precedenza. Ad esempio, per usare C:\Foo\Bar come percorso virtuale, C:\Foo deve essere una directory su disco o creata in precedenza come percorso virtuale per un altro collegamento. Poiché non esiste alcun elemento padre per un volume, non è possibile creare un collegamento senza ancoraggio a un volume che non esiste. Ad esempio, la creazione di un collegamento di associazione con un percorso virtuale "Z:" avrà esito negativo se non esiste già un volume denominato "Z".
Collegamenti ombreggiatura
Un collegamento shadow è uno dei punti in cui è presente il percorso virtuale nel volume prima della creazione del collegamento. Quando un percorso virtuale di questo tipo viene usato per creare un collegamento, il contenuto del percorso virtuale viene nascosto mentre il contenuto del percorso di backup diventa visibile nel percorso virtuale. Ad esempio:
- C:\Foo esiste su disco con due file Cat.txt e Dog.txt
- C:\Bar esiste su disco con due file Cow.txt e Mouse.txt
Quando viene creato un collegamento con C:\Foo come percorso virtuale e C:\Bar come percorso di backup, il percorso C:\Foo mostrerà quindi Cow.txt e Mouse.txt a tutti gli utenti mentre Cat.txt e Dog.txt verranno nascosti, fino a quando il collegamento non viene rimosso.
Un altro esempio del diagramma seguente consente di distinguere tra collegamento shadow e collegamento senza ancoraggio.
Un utente che enumera c:\Foo troverà la directory e il relativo contenuto esistente anche prima che vengano creati i collegamenti di associazione visualizzati nel diagramma. Dopo aver creato i collegamenti, l'enumerazione c:\Foo mostrerà C:\Foo\Bar e Cow.txt. Poiché C:\Foo esiste sul disco con o senza il collegamento, il collegamento tra C:\Foo e \\Remote\Target è un collegamento shadow.
Un utente che enumera c:\Foo non visualizzerebbe c:\Foo\Bar prima della creazione del secondo collegamento di associazione. Poiché C:\Foo\Bar viene visualizzato solo dopo l'aggiunta del collegamento tra c:\Foo\Bar e C:\Target2, è puramente virtuale e quindi il collegamento tra c:\Foo\Bar e C:\Target2 è un collegamento senza ancoraggio.
Si noti che, per entrambi questi tipi di collegamenti, si applicano i descrittori di sicurezza del percorso di supporto.
Alcuni flag possono essere passati per modificare il comportamento predefinito in base alle esigenze dell'utente.
flag CREATE_BIND_LINK_FLAG_MERGED
Un collegamento unito è simile a un collegamento shadow, ad eccezione del contenuto esistente nel percorso virtuale viene unito al percorso di backup. Per creare questo tipo di collegamento, è necessario usare il flag CREATE_BIND_LINK_FLAG_MERGED .
Si consideri di nuovo l'esempio precedente per il collegamento shadow, con l'aggiunta di questo flag.
Ad esempio:
- C:\Foo esiste su disco con due file Cat.txt e Dog.txt
- C:\Bar esiste su disco con due file Cow.txt e Mouse.txt
Quando viene creato un collegamento con C:\Foo come percorso virtuale e C:\Bar come percorso di backup con il flag CREATE_BIND_LINK_FLAG_MERGED, il percorso C:\Foo mostrerà Cat.txt, Dog.txt, Cow.txt e Mouse.txt.
È importante ricordare che i collegamenti uniti si applicano solo quando il percorso virtuale è una directory. Nel caso in cui un file venga visualizzato sia nel percorso di backup che nel percorso virtuale, il file nel percorso di backup ha la precedenza, ovvero il file nel percorso virtuale è mascherato. Questo vale in modo ricorsivo per tutte le directory all'interno del percorso virtuale. Poiché l'unione si applica alle directory, se virtualPath e backingPath hanno entrambe una directory con lo stesso nome allo stesso livello, la directory verrà unita come risultato del collegamento. Se il collegamento non è stato unito, la directory in backingPath avrà la precedenza ed eseguirà l'override della directory in virtualPath. Se un file è stato creato nel percorso unito quando esiste il collegamento unito, verrà creato fisicamente in backingPath (come accade con qualsiasi collegamento di associazione) ed eseguirà l'override di un file con lo stesso nome in virtualPath.
Si considerino le strutture di directory seguenti e i due collegamenti diversi:
- c:\Foo\Sub\Foo_sub.txt
- c:\Bar\Sub\Bar_sub.txt.
Se c:\Foo è collegato a c:\Bar senza merge, c:\Foo\Sub mostrerà solo Bar_sub.txt. Tuttavia, se c:\Foo è collegato a c:\Bar con merge, c:\Foo\Sub mostrerà sia Foo_sub.txt che Bar_sub.txt.
Poiché i collegamenti di associazione sono collegamenti basati sul percorso, se un file viene sostituito, modificato o eliminato/ricreato nel percorso di backup dopo la creazione del collegamento, il percorso virtuale punterà al file esistente al momento in cui viene seguito il collegamento. Ciò si verifica perché il collegamento viene risolto al momento dell'apertura di un file. Di conseguenza, se un file dal percorso di backup mascherava un file nel percorso virtuale a causa del collegamento e se il file nel percorso di backup è stato eliminato, una richiesta successiva per aprire il file verrà aperta nel percorso virtuale.
flag CREATE_BIND_LINK_FLAG_READ_ONLY
I collegamenti di sola lettura sono collegamenti di associazione in cui gli utenti del sistema non possono apportare modifiche ai file che risiedono nel percorso di backup se si accede tramite il percorso virtuale. Ciò significa che un utente con l'autorizzazione per modificare un file nel percorso di backup può comunque modificare tale file se accede tramite il percorso di backup, ma non se vi accede tramite il percorso virtuale. In genere, le autorizzazioni del percorso di backup si applicano come tale quando si accede al percorso virtuale corrispondente, tuttavia quando si usa CREATE_BIND_LINK_FLAG_READ_ONLY flag le autorizzazioni di scrittura vengono mascherate. Ciò garantisce che le applicazioni vedano che il file è CREATE_BIND_LINK_FLAG_READ_ONLY.
Si noti che la restrizione di sola lettura si applica solo ai file che risiedono nel percorso di backup su disco. Se il collegamento viene unito e i file che provengono originariamente dal percorso della directory virtuale sono visibili, rimarranno modificabili.
Ad esempio:
- C:\Foo esiste su disco con un file Cat.txt
- C:\Bar esiste su disco con un file Cow.txt
Quando viene creato un collegamento con C:\Foo come percorso virtuale e C:\Bar come percorso di backup e il collegamento è contrassegnato come di sola lettura e unito, sia Cat.txt che Cow.txt saranno visibili in C:\Foo, tuttavia, Cat.txt sarà modificabile mentre Cow.txt non sarà modificabile.
Inoltre, questa API supporta diversi altri scenari di collegamento. Queste sono descritte nelle sezioni seguenti.
Collegamenti annidati
I collegamenti di associazione possono essere annidati. Ciò significa che un predecessore o un componente discendente di un percorso virtuale può anche essere un percorso virtuale per il proprio collegamento.
Si noti che non esiste alcuna restrizione per l'attivazione di collegamenti circolari.
Prendere in considerazione i collegamenti e l'ordine dei collegamenti nel diagramma "Collegamenti associati annidati" sopra.
Se viene creato un collegamento con il percorso virtuale C:\Foo\Bar, è possibile creare un altro collegamento con C:\Foo come percorso virtuale e un altro collegamento può essere creato con C:\Foo\Bar\Baz come percorso virtuale.
Ad esempio:
- C:\Target esiste su disco con un file Cat.txt
- C:\Target2 esiste su disco con un file Dog.txt
- C:\Foo esiste su disco con una barra della directory
Se C:\Foo\Bar è collegato a C:\Target (Link1) e quindi C:\Foo è collegato a C:\Target2 (Link2), un utente che enumera C:\Foo visualizzerà Dog.txt e la barra della directory, poiché Bar è un percorso virtuale per il proprio collegamento. Successivamente, se C:\Foo\Bar\Baz è collegato a C:\Target2 (Link3), un utente che enumera c:\Foo\Bar visualizzerà Cat.txt e la directory Baz, poiché Baz è un percorso virtuale per il proprio collegamento.
Altri scenari di collegamento di associazione
I punti seguenti sono importanti e devono essere sempre considerati insieme quando si decide il risultato di un collegamento o di un set di collegamenti:
Il percorso di backup ha sempre la precedenza ed esegue l'override se un'entità con gli stessi nomi esiste nel percorso virtuale o in virtù di un collegamento. Questo vale per tutti i tipi di collegamenti di binding.
Si consideri ad esempio il collegamento seguente:
c:\Foo è collegato a c:\Target, dove c:\Target è un file.
In questo caso c:\Foo avrà un aspetto simile a un file con contenuto di c:\Target per un collegamento senza ancoraggio. Anche se c:\Foo è una directory esistente in locale (collegamento shadow), il collegamento precedente creerà c:\Foo come un file se il collegamento e il percorso sottostante esistono.
In caso di collegamenti in conflitto, il collegamento creato più di recente ha la precedenza. Tuttavia, il collegamento più recente non può nascondere un collegamento precedente.
Come un altro esempio, considerare i collegamenti seguenti. Il secondo collegamento modifica la visualizzazione dello spazio dei nomi.
- Link1: c:\Foo è collegato a c:\Target, dove c:\Target è una directory. c:\Target ha una barra dei file
- Link2: c:\Foo\Bar è collegato a c:\Target2, dove Target2 è una directory contenente un file Cat.txt
In questo caso, dopo la creazione di Link1, c:\Foo avrà una barra dei file. Tuttavia, dopo Link2, c:\Foo mostrerà una barra della directory con un file Cat.txt. Analogamente, se c:\Target2 era un file, c:\Foo\Bar sarà un file con il contenuto di C:\Target2
D'altra parte, se l'ordine dei collegamenti è stato invertito come illustrato di seguito, c:\Foo\Bar continuerà a essere visualizzato come directory che mostra Cat.txt da c:\Target2. Il percorso di backup ha la precedenza sugli elementi in un percorso virtuale, ma non hanno la precedenza sulla radice del percorso virtuale stesso.
- Link1: c:\Foo\Bar è collegato a c:\Target2, dove Target2 è una directory contenente un file Cat.txt
- Link2: c:\Foo è collegato a c:\Target, dove c:\Target è una directory. c:\Target ha una barra dei file
Per creare correttamente un collegamento, l'elemento padre del percorso virtuale deve esistere localmente o essere visualizzato a causa di backingPath in un collegamento precedente o essere un percorso virtuale stesso in un collegamento.
Ad esempio, se c:\Foo è collegato prima a c:\Target e quindi c:\Foo\Bar\Baz viene collegato a un percorso di backup, il collegamento da c:\Foo\Bar\Baz avrà esito positivo se c:\Foo\Bar\Bar esiste a causa di una delle condizioni seguenti:
- c:\Foo\Bar esiste localmente e un'eccezione nel collegamento precedente assicura che c:\Foo\Bar non sia ombreggiato da c:\Target (fare riferimento alle eccezioni nella sezione successiva) o
- c:\Foo\Bar esiste in virtù del collegamento precedente (ad esempio, se c:\Target ha una barra della directory) o
- c:\Foo\Bar è un percorso virtuale stesso in un altro collegamento (c:\Foo\Bar ==> qualcosa)
Nota
Ciò implica che i collegamenti senza ancoraggio annidati devono essere creati con il collegamento più profondo creato per ultimo. Tuttavia, i collegamenti shadow non hanno tali restrizioni, poiché i percorsi virtuali esistono già sul disco.
Si considerino i collegamenti seguenti creati nello stesso ordine:
- C:\Foo è collegato a C:\Target
- C:\Foo\Bar è collegato a c:\Target2
La creazione di un collegamento non ha alcun effetto sul comportamento del percorso di backup. Di conseguenza, la barra della directory virtuale viene visualizzata in c:\Foo e non in c:\Target. La tabella dei collegamenti sarà simile alla seguente:
- C:\Foo --> c:\Target, C:\Foo\Bar --> c:\Target2 e non
- C:\Foo --> c:\Target, c:\Target\Bar --> c:\Target2
Eccezioni per associare i collegamenti
Facoltativamente, è possibile specificare eccezioni per limitare l'ambito del collegamento creato. I percorsi di eccezione sono discendenti del percorso virtuale in cui il collegamento non si applica. I percorsi delle eccezioni possono essere file o directory, ma devono essere discendenti del percorso virtuale. Le API richiedono che i percorsi delle eccezioni siano accessibili quando viene creato il collegamento. L'eccezione si applica a tutti i discendenti del percorso dell'eccezione. Ad esempio:
- C:\Foo esiste su disco e contiene una barra di directory e una directory Baz
- C:\Foo\Bar contiene Cat.txt
- C:\Foo\Baz contiene Dog.txt
- C:\Target esiste su disco e contiene un file Cow.txt
Se viene creato un collegamento da C:\Foo a C:\Target con un'eccezione per C:\Foo\Baz, l'utente visualizzerà quanto segue:
- C:\Foo conterrà il file Cow.txt da C:\Target e la directory Baz con il relativo Dog.txt figlio. Tieni presente che C:\Foo\Bar non sarà visibile perché è stato ombreggiato dal collegamento.
Il diagramma seguente rappresenta lo scenario descritto in precedenza:
Infine, le eccezioni di collegamento di associazione non si applicano ai collegamenti senza ancoraggio poiché i percorsi virtuali senza ancoraggio non hanno discendenti per definizione e, di conseguenza, non hanno percorsi idonei. L'API restituirà un errore se si tenta di passare eccezioni al collegamento senza ancoraggio.