Introducción a la Bindlink de API
La biblioteca Bindlink permite a los usuarios administradores enlazar un espacio de nombres del sistema de archivos a una ruta de acceso virtual local a través del filtro de enlace (minifiltro bindflt.sys). Los vínculos de enlace proporcionan redirección del sistema de archivos desde una ruta de acceso virtual local a una ruta de acceso de respaldo local o remota. Pueden habilitar principalmente dos tipos de escenarios: en primer lugar, pueden hacer que los archivos remotos a través de un recurso compartido de red aparezcan localmente, lo que mejora la compatibilidad de la aplicación y, en segundo lugar, permiten escenarios en los que una aplicación quiere que los archivos de diferentes ubicaciones aparezcan en una nueva ubicación, potencialmente con diferentes nombres y estructuras de directorio, sin copiar los archivos. Los vínculos de enlace son transparentes para las aplicaciones y todas las API existentes funcionan sin tener conocimiento de esta redirección. No se crea ningún archivo físico o directorio para la ruta de acceso virtual y los vínculos de enlace amplían los descriptores de seguridad y los permisos de los archivos y directorios de la ruta de acceso de respaldo a la ruta de acceso virtual.
Uso
El conjunto de API consta de 2 funciones relacionadas:
- CreateBindLink: esta API permite a los administradores crear un vínculo de enlace entre una ruta de acceso virtual y una ruta de acceso de respaldo.
- RemoveBindLink: esta API permite al usuario quitar un vínculo creado anteriormente mediante una llamada a CreateBindLink.
Para ver un uso de ejemplo de estas funciones, consulte Ejemplos de Bindlink.
Creación de vínculos de enlace
Los vínculos de enlace son transparentes para las aplicaciones y, aunque estos vínculos existen, todas las operaciones se aplican a la ruta de acceso de respaldo. Como resultado, DeleteFile o RemoveDirectory actuarán sobre la ruta de acceso de respaldo, eliminando eficazmente la ruta de acceso de respaldo, pero no el vínculo. Esta API producirá un error si el usuario no tiene privilegios de administrador, si el usuario no tiene permisos para abrir la ruta de acceso virtual o la ruta de acceso de respaldo, si la ruta de acceso de respaldo no existe, si existe otro vínculo para la ruta de acceso virtual o si hay un error interno al configurar el vínculo. En concreto, el usuario administrador debe poder adjuntar el filtro (permisos para FilterAttach), conectarse al puerto de filtro (permisos para FilterConnectCommunicationPort) y acceder a la raíz de la ruta de acceso de respaldo o, de lo contrario, se producirá un error en la API con ERROR_ACCESS_DENIED.
Si una aplicación intenta seguir el vínculo a una ruta de acceso de respaldo que se eliminó después de configurar el vínculo, la aplicación verá ERROR_FILE_NOT_FOUND*. Más adelante, si se vuelve a crear la ruta de acceso de respaldo, el vínculo ahora se aplicará a esta nueva ruta de acceso de respaldo. Si se creara un archivo en virtualPath mientras existe el vínculo, se mostrará en virtualPath si el vínculo existe, pero se crea físicamente en la ruta de acceso de respaldo. Cuando se quita el vínculo, el archivo solo aparecería en la ruta de acceso de respaldo y ya no aparecería en virtualPath. Esto se aplica a todos los tipos de vínculos descritos a continuación.
Dependiendo de si la ruta de acceso virtual está presente en el disco, el vínculo resultante será un vínculo sin anclaje o un vínculo paralelo.
Vínculos sin anclaje
Los vínculos sin anclaje son vínculos de enlace que se crean cuando la ruta de acceso virtual no existe en el disco antes de crear el vínculo. Cuando se crea este tipo de vínculo, la ruta de acceso virtual se sintetiza en memoria y aparece como una ruta de acceso normal en el sistema de archivos. Tenga en cuenta que para crear este vínculo de enlace, el elemento principal de la ruta de acceso virtual debe existir como un directorio en disco o como un vínculo creado anteriormente. Por ejemplo, para usar C:\Foo\Bar como ruta de acceso virtual, C:\Foo debe ser un directorio en disco o creado previamente como ruta de acceso virtual para otro vínculo. Dado que no hay ningún elemento principal para un volumen, no puede haber un vínculo sin anclaje a un volumen que no exista. Por ejemplo, al crear un vínculo de enlace con una ruta de acceso virtual "Z:" se produciría un error si aún no hubiera un volumen denominado "Z".
Vínculos paralelos
Un vínculo paralelo es aquel en el que existe la ruta de acceso virtual en el volumen antes de crear el vínculo. Cuando se usa dicha ruta de acceso virtual para crear un vínculo, el contenido de la ruta de acceso virtual se oculta mientras el contenido de la ruta de acceso de respaldo se vuelve visible en la ruta de acceso virtual. Por ejemplo:
- C:\Foo existe en el disco con dos archivos Cat.txt y Dog.txt
- C:\Bar existe en el disco con dos archivos Cow.txt y Mouse.txt
Cuando se crea un vínculo con C:\Foo como ruta de acceso virtual y C:\Bar como ruta de acceso de respaldo, la ruta de acceso C:\Foo mostrará Cow.txt y Mouse.txt a todos los usuarios mientras que Cat.txt y Dog.txt se ocultarán hasta que se quite el vínculo.
Otro ejemplo del diagrama siguiente ayuda a distinguir entre el vínculo paralelo y el vínculo sin anclaje.
Un usuario que enumere c:\Foo encontrará el directorio y su contenido existente incluso antes de que se cree cualquiera de los vínculos de enlace que se muestran en el diagrama. Una vez creados los vínculos, la enumeración de c:\Foo mostrará C:\Foo\Bar y Cow.txt. Dado que C:\Foo existe en el disco con o sin el vínculo, el vínculo entre C:\Foo y \\Remote\Target es un vínculo paralelo.
Un usuario que enumere c:\Foo no verá c:\Foo\Bar antes de crear el segundo vínculo de enlace. Dado que C:\Foo\Bar aparece solo después de que se agregue el vínculo entre c:\Foo\Bar y C:\Target2, es puramente virtual y, por tanto, el vínculo entre c:\Foo\Bar y C:\Target2 es un vínculo sin anclaje.
Tenga en cuenta que, para ambos tipos de vínculos, se aplican los descriptores de seguridad de la ruta de acceso de respaldo.
Se pueden transferir ciertas marcas para cambiar el comportamiento predeterminado para adaptarse a las necesidades del usuario.
Marca CREATE_BIND_LINK_FLAG_MERGED
Un vínculo combinado es como un vínculo paralelo, salvo que el contenido existente en la ruta de acceso virtual se combina con la ruta de acceso de respaldo. Para crear este tipo de vínculo, se debe usar la marca CREATE_BIND_LINK_FLAG_MERGED.
Consideremos de nuevo el ejemplo anterior del vínculo paralelo, añadiendo esta marca.
Por ejemplo:
- C:\Foo existe en el disco con dos archivos Cat.txt y Dog.txt
- C:\Bar existe en el disco con dos archivos Cow.txt y Mouse.txt
Cuando se crea un vínculo con C:\Foo como ruta de acceso virtual y C:\Bar como ruta de acceso de respaldo con la marca CREATE_BIND_LINK_FLAG_MERGED, la ruta de acceso de C:\Foo mostrará Cat.txt, Dog.txt, Cow.txt y Mouse.txt.
Es importante recordar que los vínculos combinados solo se aplican cuando la ruta de acceso virtual es un directorio. En el caso de que un archivo aparezca en la ruta de acceso de respaldo y en la ruta de acceso virtual, el archivo de la ruta de acceso de respaldo tiene prioridad, es decir, el archivo de la ruta de acceso virtual se enmascara. Esto se aplica de forma recursiva para todos los directorios dentro de la ruta de acceso virtual. Dado que la combinación se aplica a los directorios, si virtualPath y backingPath tienen un directorio con el mismo nombre en el mismo nivel, el directorio se combinará como resultado del vínculo. Si el vínculo no era un vínculo combinado, el directorio de backingPath tendrá prioridad y anulará el directorio en virtualPath. Si se creó un archivo en la ruta de acceso combinada cuando existe el vínculo combinado, se creará físicamente en backingPath (como sucede con cualquier vínculo de enlace) y reemplazará un archivo con el mismo nombre en virtualPath.
Consideremos las siguientes estructuras de directorio y los dos vínculos diferentes:
- c:\Foo\Sub\Foo_sub.txt
- c:\Bar\Sub\Bar_sub.txt.
Si c:\Foo está vinculado a c:\Bar sin combinación, c:\Foo\Sub solo mostrará Bar_sub.txt. Sin embargo, si c:\Foo está vinculado a c:\Bar con combinación, c:\Foo\Sub mostrará tanto Foo_sub.txt como Bar_sub.txt.
Dado que los vínculos de enlace son vínculos basados en rutas de acceso, si un archivo se reemplaza, modifica, elimina o se vuelve a crear en la ruta de acceso de respaldo después de crear el vínculo, la ruta de acceso virtual apuntará al archivo existente en el momento en que se sigue el vínculo. Esto sucede porque el vínculo se resuelve en el momento en que se abre un archivo. En consecuencia, si un archivo de la ruta de acceso de respaldo enmascaraba un archivo en la ruta de acceso virtual debido al vínculo y si el archivo de la ruta de acceso de respaldo se eliminó, una solicitud posterior para abrir el archivo lo abrirá en la ruta de acceso virtual.
Marca CREATE_BIND_LINK_FLAG_READ_ONLY
Los vínculos de solo lectura son vínculos de enlace donde se impide que los usuarios del sistema realicen cambios en los archivos que residen en la ruta de acceso de respaldo si se accede a ellos a través de la ruta de acceso virtual. Esto significa que un usuario con permiso para modificar un archivo en la ruta de acceso de respaldo todavía puede modificar ese archivo si accede a él a través de la ruta de acceso de respaldo, pero no si accede a él a través de la ruta de acceso virtual. Normalmente, los permisos de la ruta de acceso de respaldo se aplican como tal cuando se accede a la ruta de acceso virtual correspondiente, pero cuando se usa la marca CREATE_BIND_LINK_FLAG_READ_ONLY se enmascaran los permisos de escritura. Esto garantiza que las aplicaciones vean que el archivo tiene la propiedad CREATE_BIND_LINK_FLAG_READ_ONLY.
Tenga en cuenta que la restricción de solo lectura solo se aplica a los archivos que residen en la ruta de acceso de respaldo en el disco. Si el vínculo se combina y los archivos que se encuentran originalmente en la ruta de acceso del directorio virtual son visibles, seguirán siendo modificables.
Por ejemplo:
- C:\Foo existe en el disco con un archivo Cat.txt
- C:\Bar existe en el disco con un archivo Cow.txt
Cuando se crea un vínculo con C:\Foo como ruta de acceso virtual y C:\Bar como ruta de acceso de respaldo y el vínculo se marca como de solo lectura y se combina, tanto Cat.txt como Cow.txt estarán visibles en C:\Foo, pero Cat.txt se podrá modificar y Cow.txt no se podrá modificar.
Además, esta API admite otros escenarios de vínculo. Estos se describen en las secciones siguientes.
Vínculos anidados
Los vínculos de enlace se pueden anidar. Esto significa que un componente antecesor o descendiente de una ruta de acceso virtual también puede ser una ruta de acceso virtual para su propio vínculo.
Tenga en cuenta que no hay ninguna restricción en los vínculos circulares subsiguientes.
Observe los vínculos y su orden en el diagrama "Vínculos de enlace anidados" anterior.
Si se crea un vínculo con la ruta de acceso virtual: C:\Foo\Bar, se puede crear otro vínculo con C:\Foo como ruta de acceso virtual y se puede crear otro vínculo con C:\Foo\Bar\Baz como ruta de acceso virtual.
Por ejemplo:
- C:\Target existe en el disco con un archivo Cat.txt
- C:\Target2 existe en el disco con un archivo Dog.txt
- C:\Foo existe en el disco con una barra de directorios
Si C:\Foo\Bar se vincula a C:\Target (Link1) y, a continuación, C:\Foo se vincula C:\Target2 (Link2), un usuario que enumere C:\Foo verá Dog.txt y la barra de directorios, ya que Bar es una ruta de acceso virtual para su propio vínculo. Posteriormente, si C:\Foo\Bar\Baz se vincula a C:\Target2 (Link3), un usuario que enumere c:\Foo\Bar verá Cat.txt y el directorio Baz, ya que Baz es una ruta de acceso virtual para su propio vínculo.
Escenarios de vínculo de enlace adicionales
Los siguientes puntos son importantes y siempre deben considerarse conjuntamente a la hora de decidir el resultado de un vínculo o un conjunto de vínculos:
La ruta de acceso de respaldo siempre tiene prioridad y prevalece si existe una entidad con los mismos nombres en la ruta virtual o en virtud de un vínculo. Esto se aplica a todo tipo de vínculos de enlace.
Por ejemplo, considere el siguiente vínculo:
c:\Foo está vinculado a c:\Target, donde c:\Target es un archivo.
En ese caso, c:\Foo tendrá un aspecto similar a un archivo que tenga contenido de c:\Target para un vínculo sin anclaje. Incluso si c:\Foo es un directorio que existe localmente (vínculo paralelo), el vínculo anterior hará que c:\Foo tenga un aspecto similar a un archivo si el vínculo y la ruta de acceso de respaldo existen.
En caso de conflictos de vínculos, el vínculo creado más recientemente tiene prioridad. Sin embargo, el vínculo más reciente no puede ocultar un vínculo anterior.
Otro ejemplo son los siguientes vínculos. El segundo vínculo cambia la vista del espacio de nombres.
- Link1: c:\Foo está vinculado a c:\Target, donde c:\Target es un directorio. c:\Target tiene una barra de archivos
- Link2: c:\Foo\Bar está vinculado a c:\Target2, donde Target2 es un directorio que contiene un archivo Cat.txt
En este caso, después de crear Link1, c:\Foo tendrá una barra de archivos. Sin embargo, después de Link2, c:\Foo mostrará una barra de directorios con un archivo Cat.txt. Del mismo modo, si c:\Target2 fuera un archivo, c:\Foo\Bar sería un archivo con el contenido de C:\Target2
Por otro lado, si el orden de los vínculos se revierte como se muestra a continuación, c:\Foo\Bar seguirá apareciendo como un directorio que muestra Cat.txt de c:\Target2. La ruta de acceso de respaldo tiene prioridad sobre los elementos de una ruta de acceso virtual, pero no tiene prioridad sobre la propia raíz de la ruta de acceso virtual.
- Link1: c:\Foo\Bar está vinculado a c:\Target2, donde Target2 es un directorio que contiene un archivo Cat.txt
- Link2: c:\Foo está vinculado a c:\Target, donde c:\Target es un directorio. c:\Target tiene una barra de archivos
Para que un vínculo se cree correctamente, el elemento principal de la ruta de acceso virtual debe existir localmente o mostrarse debido a la backingPath en un vínculo anterior o ser una ruta de acceso virtual en un vínculo.
Por ejemplo, si c:\Foo se vincula primero a c:\Target y luego c:\Foo\Bar\Baz se vincula a una ruta de acceso de respaldo, el vínculo de c:\Foo\Bar\Baz se realizará correctamente si c:\Foo\Bar existe debido a una de las condiciones siguientes:
- c:\Foo\Bar existe localmente y una excepción en el vínculo anterior garantiza que c:\Foo\Bar no se haya reemplazado por c:\Target (consulte Excepciones en la sección siguiente) o
- c:\Foo\Bar existe en virtud del vínculo anterior (es decir, si c:\Target tiene una barra de directorios) o
- c:\Foo\Bar es una ruta de acceso virtual en otro vínculo (c:\Foo\Bar ==> algo)
Nota:
Esto implica que los vínculos anidados sin anclaje deben crearse con el vínculo más profundo en último lugar. Sin embargo, los vínculos paralelos no tienen restricciones, ya que las rutas de acceso virtuales ya existen en el disco.
Considere los siguientes vínculos creados en el mismo orden:
- C:\Foo está vinculado a C:\Target
- C:\Foo\Bar está vinculado a c:\Target2
La creación de un vínculo no tiene ningún efecto en el comportamiento de la ruta de acceso de respaldo. Por lo tanto, la barra de directorios virtuales se muestra en c:\Foo y no en c:\Target. La tabla de vínculos tendrá este aspecto:
- C:\Foo --> c:\Target, C:\Foo\Bar --> c:\Target2 y no
- C:\Foo --> c:\Target, c:\Target\Bar --> c:\Target2
Excepciones a los vínculos de enlace
Opcionalmente, se pueden especificar excepciones para limitar el ámbito del vínculo creado. Las rutas de acceso de excepción son descendientes de la ruta de acceso virtual en las que no se aplica el vínculo. Las rutas de acceso de excepción pueden ser archivos o directorios, pero deben ser descendientes de la ruta de acceso virtual. Las API requieren que se pueda acceder a las rutas de acceso de excepción cuando se crea el vínculo. La excepción se aplica a todos los descendientes de la ruta de acceso de excepción. Por ejemplo:
- C:\Foo existe en el disco y contiene una barra de directorios y un directorio Baz
- C:\Foo\Bar contiene Cat.txt
- C:\Foo\Baz contiene Dog.txt
- C:\Target existe en el disco y contiene un archivo Cow.txt
Si se crea un vínculo desde C:\Foo a C:\Target con una excepción para C:\Foo\Baz, el usuario verá lo siguiente:
- C:\Foo contendrá el archivo Cow.txt de C:\Target y el directorio Baz con su Dog.txt secundario. Tenga en cuenta que C:\Foo\Bar no estará visible, ya que el vínculo lo ha reemplazado.
El siguiente diagrama representa el escenario descrito anteriormente:
Por último, las excepciones de vínculo de enlace no se aplican a los vínculos sin anclaje, ya que las rutas de acceso virtuales sin anclaje no tienen descendientes por definición y, por lo tanto, no tienen rutas de acceso aptas. La API devolverá un error si se intenta transferir excepciones al vínculo sin anclaje.