Bagikan melalui


Gambaran umum API Bindlink

Pustaka Bindlink memungkinkan pengguna admin untuk mengikat namespace sistem file ke jalur virtual lokal melalui Filter Ikat (filter mini bindflt.sys). Bind Links menyediakan pengalihan sistem file dari jalur virtual lokal ke jalur backing lokal atau jarak jauh. Mereka terutama dapat mengaktifkan dua jenis skenario: pertama, mereka dapat membuat file jarak jauh melalui berbagi jaringan muncul secara lokal yang meningkatkan kompatibilitas aplikasi, dan kedua, mereka mengaktifkan skenario di mana aplikasi ingin file dari lokasi yang berbeda muncul di lokasi baru, berpotensi dengan nama dan struktur direktori yang berbeda, tanpa menyalin file. Bind Links transparan untuk aplikasi dan semua API yang ada berfungsi tanpa sepengetahuan pengalihan ini. Tidak ada file atau direktori fisik yang dibuat untuk jalur virtual dan tautan yang mengikat memperluas deskriptor keamanan dan izin file dan direktori di jalur backing ke jalur virtual.

Penggunaan

Set API terdiri dari 2 fungsi terkait:

  • CreateBindLink – API ini memungkinkan admin untuk membuat tautan pengikatan antara jalur virtual dan jalur dukungan.
  • RemoveBindLink – API ini memungkinkan pengguna untuk menghapus tautan yang sebelumnya dibuat dengan memanggil CreateBindLink.

Untuk contoh penggunaan fungsi ini, lihat Contoh bindlink.

Tautan ikatan transparan untuk aplikasi dan sementara tautan ini ada, semua operasi berlaku untuk jalur backing. Akibatnya, DeleteFile atau RemoveDirectory akan bertindak berdasarkan jalur backing, secara efektif menghapus jalur backing tetapi bukan tautan. API ini akan gagal jika pengguna tidak memiliki hak istimewa Administrator, jika pengguna tidak memiliki izin untuk membuka jalur virtual atau jalur pencadangan, jika jalur pencadangan tidak ada, jika ada tautan lain untuk jalur virtual, atau jika ada kegagalan internal saat menyiapkan tautan. Secara khusus, pengguna admin harus dapat melampirkan filter (izin untuk FilterAttach), menyambungkan ke port filter (izin untuk Filter Koneksi CommunicationPort) dan mengakses akar jalur pencadangan atau api akan gagal dengan ERROR_ACCESS_DENIED.

Jika aplikasi mencoba mengikuti tautan ke jalur dukungan yang dihapus setelah tautan disiapkan, aplikasi akan melihat ERROR_FILE_NOT_FOUND*. Nantinya jika jalur backing dibuat lagi, tautan sekarang akan berlaku untuk jalur backing baru ini. Jika file dibuat di virtualPath saat tautan ada, file akan muncul di virtualPath jika tautan ada tetapi dibuat secara fisik di jalur pencadangan. Ketika tautan dihapus, file hanya akan muncul di jalur pencadangan dan tidak akan muncul lagi di virtualPath. Ini berlaku untuk semua jenis tautan yang dijelaskan di bawah ini.

Bergantung pada apakah jalur virtual ada di disk, tautan yang dihasilkan akan menjadi tautan tanpa jangkar atau tautan bayangan.

Tautan tanpa jangkar adalah tautan ikat yang dibuat ketika jalur virtual tidak ada pada disk sebelum tautan dibuat. Ketika tautan semacam ini dibuat, jalur virtual disintesis dalam memori dan muncul seperti jalur biasa di sistem file. Perhatikan bahwa untuk membuat tautan ikat seperti itu, induk jalur virtual harus ada baik sebagai direktori di disk atau sebagai tautan yang dibuat sebelumnya. Misalnya, untuk menggunakan C:\Foo\Bar sebagai jalur virtual, C:\Foo harus berupa direktori on-disk atau sebelumnya dibuat sebagai jalur virtual untuk tautan lain. Karena tidak ada induk untuk volume, tidak boleh ada tautan tanpa jangkar ke volume yang tidak ada. Misalnya, membuat tautan ikat dengan jalur virtual "Z:" akan gagal jika belum ada volume bernama "Z".

Tautan bayangan adalah salah satu tempat jalur virtual ada pada volume sebelum tautan dibuat. Ketika jalur virtual seperti itu digunakan untuk membuat tautan, konten jalur virtual disembunyikan sementara konten jalur dukungan menjadi terlihat di jalur virtual. Misalnya:

  • C:\Foo ada di disk dengan dua file Cat.txt dan Dog.txt
  • C:\Bar ada di disk dengan dua file Cow.txt dan Mouse.txt

Ketika tautan dibuat dengan C:\Foo sebagai jalur virtual dan C:\Bar sebagai jalur backing, jalur C:\Foo kemudian akan menampilkan Cow.txt dan Mouse.txt kepada semua pengguna saat Cat.txt dan Dog.txt akan disembunyikan, hingga tautan dihapus.

Contoh lain dalam diagram berikut membantu membedakan antara tautan Shadow dan tautan Tanpa Jangkar.

Anchorless versus shadow bind links diagram

Pengguna yang menghitung c:\Foo akan menemukan direktori dan konten yang ada bahkan sebelum salah satu tautan ikatan yang ditampilkan dalam diagram dibuat. Setelah tautan dibuat, menghitung c:\Foo akan menampilkan C:\Foo\Bar dan Cow.txt. Karena C:\Foo ada di disk dengan atau tanpa tautan, tautan antara C:\Foo dan \\Remote\Target adalah tautan bayangan.

Pengguna yang menghitung c:\Foo tidak akan melihat c:\Foo\Bar sebelum tautan pengikatan kedua dibuat. Karena C:\Foo\Bar muncul hanya setelah tautan antara c:\Foo\Bar dan C:\Target2 ditambahkan, Ini murni virtual dan karenanya tautan antara c:\Foo\Bar dan C:\Target2 adalah tautan Tanpa Jangkar.

Perhatikan bahwa, untuk kedua jenis tautan ini, deskriptor keamanan jalur dukungan berlaku.

Bendera tertentu dapat diteruskan untuk mengubah perilaku default agar sesuai dengan kebutuhan pengguna.

Tautan gabungan seperti tautan bayangan, kecuali konten yang ada di jalur virtual digabungkan dengan jalur penolakan. Untuk membuat tautan semacam ini, bendera CREATE_BIND_LINK_FLAG_MERGED harus digunakan.

Mari kita pertimbangkan contoh sebelumnya untuk tautan bayangan sekali lagi, dengan penambahan bendera ini.

Misalnya:

  • C:\Foo ada di disk dengan dua file Cat.txt dan Dog.txt
  • C:\Bar ada di disk dengan dua file Cow.txt dan Mouse.txt

Saat tautan dibuat dengan C:\Foo sebagai jalur virtual dan C:\Bar sebagai jalur backing dengan bendera CREATE_BIND_LINK_FLAG_MERGED, jalur C:\Foo akan menampilkan Cat.txt, Dog.txt, Cow.txt, dan Mouse.txt.

Penting untuk diingat bahwa tautan gabungan hanya berlaku ketika jalur virtual adalah direktori. Dalam kasus di mana file muncul di jalur backing dan jalur virtual, file di jalur penolakan lebih diutamakan - yaitu, file di jalur virtual ditutupi. Ini berlaku secara rekursif untuk semua direktori dalam jalur virtual. Karena penggabungan berlaku untuk direktori, jika virtualPath dan backingPath keduanya memiliki direktori dengan nama yang sama pada tingkat yang sama, direktori akan digabungkan sebagai hasil tautan. Jika tautan bukan tautan gabungan, direktori di backingPath akan diutamakan dan mengambil alih direktori di virtualPath. Jika file dibuat di jalur gabungan ketika tautan gabungan ada, file akan dibuat secara fisik di backingPath (seperti halnya dengan tautan yang diikat) dan akan mengambil alih file dengan nama yang sama di virtualPath.

Mari kita pertimbangkan struktur direktori berikut dan dua tautan yang berbeda:

  • c:\Foo\Sub\Foo_sub.txt
  • c:\Bar\Sub\Bar_sub.txt.

Jika c:\Foo ditautkan ke c:\Bar tanpa penggabungan, c:\Foo\Sub hanya akan menampilkan Bar_sub.txt. Namun, jika c:\Foo ditautkan ke c:\Bar dengan penggabungan, maka c:\Foo\Sub akan menampilkan Foo_sub.txt dan Bar_sub.txt.

Karena tautan ikat adalah tautan berbasis jalur, jika file diganti, dimodifikasi, atau dihapus/dibuat ulang di jalur dukungan setelah tautan dibuat, jalur virtual akan menunjuk ke file yang ada pada saat tautan sedang diikuti. Ini terjadi karena tautan diselesaikan pada saat file dibuka. Oleh karena itu, jika file dari jalur dukungan menutupi file di jalur virtual karena tautan, dan jika file di jalur pencadangan dihapus, permintaan berikutnya untuk membuka file akan membukanya di jalur virtual.

Tautan baca-saja adalah tautan yang mengikat di mana pengguna pada sistem dicegah membuat perubahan pada file yang berada di jalur pendukung jika mereka diakses melalui jalur virtual. Ini berarti bahwa pengguna dengan izin untuk mengubah file di jalur dukungan masih dapat memodifikasi file tersebut jika mereka mengaksesnya melalui jalur dukungan, tetapi tidak jika mereka mengaksesnya melalui jalur virtual. Biasanya, izin jalur dukungan berlaku seperti ketika jalur virtual yang sesuai diakses, namun ketika bendera CREATE_BIND_LINK_FLAG_READ_ONLY digunakan , izin tulis ditutupi. Ini memastikan bahwa aplikasi melihat bahwa file CREATE_BIND_LINK_FLAG_READ_ONLY.

Perhatikan bahwa pembatasan baca-saja hanya berlaku untuk file yang berada di jalur pencadangan pada disk. Jika tautan digabungkan dan file yang awalnya dari jalur direktori virtual terlihat, tautan tersebut akan tetap dapat dimodifikasi.

Misalnya:

  • C:\Foo ada di disk dengan file Cat.txt
  • C:\Bar ada pada disk dengan file Cow.txt

Ketika tautan dibuat dengan C:\Foo sebagai jalur virtual dan C:\Bar sebagai jalur pencadangan dan tautan ditandai baca-saja dan digabungkan, Cat.txt dan Cow.txt akan terlihat di C:\Foo, namun, Cat.txt akan dapat dimodifikasi sementara Cow.txt tidak akan dapat dimodifikasi.

Selain itu, API ini mendukung beberapa skenario tautan lainnya. Alur tersebut dijelaskan di bagian berikut.

Tautan Ikat dapat ditumpuk. Ini berarti bahwa leluhur atau komponen keturunan dari jalur virtual juga dapat menjadi jalur virtual untuk tautannya sendiri.

Perhatikan bahwa tidak ada batasan untuk mengaktifkan tautan melingkar.

Nested bind links diagram

Pertimbangkan tautan dan urutan tautan dalam diagram "Tautan Ikat berlapis" di atas.

Jika tautan dibuat dengan jalur virtual: C:\Foo\Bar, tautan lain dapat dibuat dengan C:\Foo sebagai jalur virtualnya, dan tautan lain dapat dibuat dengan C:\Foo\Bar\Baz sebagai jalur virtualnya.

Misalnya:

  • C:\Target ada di disk dengan file Cat.txt
  • C:\Target2 ada di disk dengan file Dog.txt
  • C:\Foo ada di disk dengan Bilah direktori

Jika C:\Foo\Bar ditautkan ke C:\Target (Link1) dan kemudian C:\Foo ditautkan ke C:\Target2 (Link2), pengguna yang menghitung C:\Foo akan melihat Dog.txt dan Bilah direktori, karena Bar adalah jalur virtual untuk tautannya sendiri. Selanjutnya jika C:\Foo\Bar\Baz ditautkan ke C:\Target2 (Link3), Pengguna yang menghitung c:\Foo\Bar akan melihat Cat.txt dan direktori Baz, karena Baz adalah jalur virtual untuk tautannya sendiri.

Poin-poin berikut penting dan harus selalu dipertimbangkan bersama-sama saat memutuskan hasil tautan atau serangkaian tautan:

  1. Jalur penolakan selalu diutamakan dan diambil alih jika entitas dengan nama yang sama ada di jalur virtual atau berdasarkan tautan. Ini berlaku untuk semua jenis Tautan Ikatan.

    Misalnya, pertimbangkan tautan berikut:

    c:\Foo ditautkan ke c:\Target, di mana c:\Target adalah file.

    Dalam hal ini c:\Foo akan terlihat seperti file yang memiliki konten c:\Target untuk tautan tanpa jangkar. Bahkan jika c:\Foo adalah direktori yang ada secara lokal (tautan bayangan), tautan di atas akan membuat c:\Foo terlihat seperti file jika tautan dan jalur backing ada.

  2. Jika terjadi tautan yang bertentangan, tautan yang terakhir dibuat lebih diutamakan. Namun, tautan terbaru tidak dapat menyembunyikan tautan sebelumnya.

    Sebagai contoh lain, pertimbangkan tautan berikut. Tautan kedua mengubah tampilan namespace layanan.

    • Link1: c:\Foo ditautkan ke c:\Target, di mana c:\Target adalah direktori. c:\Target memiliki Bilah file
    • Link2: c:\Foo\Bar ditautkan ke c:\Target2, di mana Target2 adalah direktori yang berisi file Cat.txt

    Order of bind links diagram

    Dalam hal ini, setelah Link1 dibuat, c:\Foo akan memiliki Bilah file. Namun, setelah Link2, c:\Foo akan menampilkan Bilah direktori dengan file Cat.txt. Demikian pula, jika c:\Target2 adalah file, c:\Foo\Bar akan menjadi file dengan konten C:\Target2

    Di sisi lain, Jika urutan tautan dibalik seperti yang ditunjukkan di bawah ini, c:\Foo\Bar akan terus muncul sebagai direktori yang menunjukkan Cat.txt dari c:\Target2. Jalur penolakan lebih diutamakan daripada item di bawah jalur virtual, tetapi tidak diutamakan daripada akar jalur virtual itu sendiri.

    • Link1: c:\Foo\Bar ditautkan ke c:\Target2, di mana Target2 adalah direktori yang berisi file Cat.txt
    • Link2: c:\Foo ditautkan ke c:\Target, di mana c:\Target adalah direktori. c:\Target memiliki Bilah file
  3. Agar tautan berhasil dibuat, induk jalur virtual harus ada secara lokal atau muncul karena backingPath di tautan sebelumnya atau menjadi jalur virtual itu sendiri dalam tautan.

    Misalnya, jika c:\Foo ditautkan ke c:\Target terlebih dahulu, lalu c:\Foo\Bar\Baz sedang ditautkan ke jalur backing, tautan dari c:\Foo\Bar\Baz akan berhasil jika c:\Foo\Bar ada karena salah satu kondisi berikut:

    • c:\Foo\Bar ada secara lokal dan pengecualian di tautan sebelumnya memastikan c:\Foo\Bar tidak dibayangi oleh c:\Target (lihat Pengecualian di Bagian berikutnya) atau
    • c:\Foo\Bar ada berdasarkan tautan sebelumnya (yaitu, jika c:\Target memiliki Bilah direktori) atau
    • c:\Foo\Bar adalah jalur virtual itu sendiri di tautan lain (c:\Foo\Bar ==> something)

    Catatan

    Ini menyiratkan bahwa tautan tanpa jangkar berlapis harus dibuat dengan tautan terdalam yang dibuat terakhir. Namun, tautan bayangan tidak memiliki batasan seperti itu, karena jalur virtual sudah ada di disk.

Pertimbangkan tautan berikut yang dibuat dalam urutan yang sama:

  • C:\Foo ditautkan ke C:\Target
  • C:\Foo\Bar ditautkan ke c:\Target2

Membuat tautan tidak berpengaruh pada perilaku jalur dukungan. Oleh karena itu Bilah direktori virtual muncul di c:\Foo dan bukan di c:\Target. Tabel tautan akan terlihat seperti ini:

  • C:\Foo --> c:\Target, C:\Foo\Bar --> c:\Target2 dan tidak
  • C:\Foo --> c:\Target, c:\Target\Bar --> c:\Target2

Secara opsional, pengecualian dapat ditentukan untuk membatasi cakupan tautan yang dibuat. Jalur pengecualian adalah turunan dari jalur virtual tempat tautan tidak berlaku. Jalur pengecualian dapat berupa file atau direktori tetapi harus merupakan turunan dari jalur virtual. API mengharuskan jalur pengecualian dapat diakses saat tautan sedang dibuat. Pengecualian berlaku untuk semua turunan jalur pengecualian. Misalnya:

  • C:\Foo ada di disk dan berisi Bilah direktori dan direktori Baz
  • C:\Foo\Bar berisi Cat.txt
  • C:\Foo\Baz berisi Dog.txt
  • C:\Target ada di disk dan berisi file Cow.txt

Jika tautan dibuat dari C:\Foo ke C:\Target dengan pengecualian untuk C:\Foo\Baz, pengguna akan melihat hal berikut:

  • C:\Foo akan berisi file Cow.txt dari C:\Target, dan direktori Baz dengan Dog.txt anaknya. Perhatikan bahwa C:\Foo\Bar tidak akan terlihat karena telah dibayangi oleh tautan.

Diagram berikut mewakili skenario yang dijelaskan di atas:

Bind link exceptions diagram

Akhirnya, pengecualian tautan ikat tidak berlaku untuk tautan tanpa jangkar karena jalur virtual tanpa jangkar tidak memiliki keturunan berdasarkan definisi dan, oleh karena itu, tidak memiliki jalur yang memenuhi syarat. API akan mengembalikan kesalahan jika ada upaya untuk meneruskan pengecualian ke tautan tanpa jangkar.

Lihat juga

Fungsi bindlink

Enum bindlink

Contoh bindlink