다음을 통해 공유


Bindlink API 개요

Bindlink 라이브러리를 사용하면 관리자가 바인딩 필터(미니 필터 bindflt.sys)를 통해 파일 시스템 네임스페이스를 로컬 가상 경로에 바인딩할 수 있습니다. 바인딩 링크는 로컬 가상 경로에서 로컬 또는 원격 지원 경로로 파일 시스템 리디렉션을 제공합니다. 주로 두 가지 종류의 시나리오를 사용하도록 설정할 수 있습니다. 첫째, 네트워크 공유를 통해 원격 파일을 로컬로 표시하여 앱 호환성을 향상시킬 수 있으며, 둘째, 애플리케이션이 파일을 복사하지 않고도 다른 위치의 파일이 새 위치에 표시되도록 할 수 있습니다. 바인딩 링크는 애플리케이션에 투명하며 모든 기존 API는 이 리디렉션에 대한 지식 없이 작동합니다. 가상 경로에 대한 실제 파일 또는 디렉터리가 만들어지지 않으며 바인딩 링크는 가상 경로에 대한 지원 경로에 있는 파일 및 디렉터리의 보안 설명자와 권한을 확장합니다.

사용

API 집합은 2개의 관련 함수로 구성됩니다.

  • CreateBindLink – 이 API를 사용하면 관리자가 가상 경로와 지원 경로 간에 바인딩 링크를 만들 수 있습니다.
  • RemoveBindLink – 이 API를 사용하면 사용자가 CreateBindLink를 호출 하여 이전에 만든 링크를 제거할 수 있습니다.

이러한 함수의 샘플 사용은 Bindlink 예제를 참조 하세요.

바인딩 링크는 애플리케이션에 투명하며 이러한 링크가 존재하는 동안 모든 작업이 지원 경로에 적용됩니다. 결과적으로 DeleteFile 또는 RemoveDirectory 는 지원 경로에 따라 작동하여 링크가 아닌 백업 경로를 효과적으로 삭제합니다. 이 API는 사용자에게 관리사용자 권한이 없거나, 사용자에게 가상 경로 또는 백업 경로를 열 수 있는 권한이 없거나, 백업 경로가 없는 경우, 가상 경로에 대한 다른 링크가 있거나, 링크를 설정하는 동안 내부 오류가 발생한 경우 실패합니다. 특히 관리자 사용자는 필터( FilterAttach에 대한 사용 권한)를 연결하고, 필터 포트( FilterConnectCommunicationPort에 대한 권한)에 연결하고, 지원 경로의 루트에 액세스하거나, 그렇지 않으면 api가 ERROR_ACCESS_DENIED 함께 실패할 수 있어야 합니다.

앱이 링크를 설치한 후 삭제된 백업 경로에 대한 링크를 따라가려고 하면 앱에 ERROR_FILE_NOT_FOUND*가 표시됩니다. 나중에 백업 경로가 다시 만들어지면 이 새 지원 경로에 링크가 적용됩니다. 링크가 있는 동안 가상 경로에서 파일을 만들어야 하는 경우 링크가 존재하지만 백업 경로에 물리적으로 만들어진 경우 가상 경로에 표시됩니다. 링크가 제거되면 파일은 지원 경로에만 표시되고 VirtualPath에 더 이상 표시되지 않습니다. 이는 아래에 설명된 모든 종류의 링크에 적용됩니다.

가상 경로가 디스크에 있는지 여부에 따라 결과 링크는 앵커리스 링크 또는 섀도 링크가 됩니다.

앵커리스 링크는 링크를 만들기 전에 가상 경로가 디스크에 없을 때 생성되는 바인딩 링크입니다. 이러한 종류의 링크를 만들면 가상 경로가 메모리 내 합성되고 파일 시스템의 일반 경로처럼 표시됩니다. 이러한 바인딩 링크를 만들려면 가상 경로의 부모가 디스크 디렉터리 또는 이전에 만든 링크로 존재해야 합니다. 예를 들어 C:\Foo\Bar를 가상 경로로 사용하려면 C:\Foo가 디스크에 있는 디렉터리이거나 이전에 다른 링크의 가상 경로로 만들어야 합니다. 볼륨에 대한 부모가 없으므로 존재하지 않는 볼륨에 대한 앵커리스 링크가 있을 수 없습니다. 예를 들어 "Z"라는 볼륨이 아직 없는 경우 가상 경로 "Z:"를 사용하여 바인딩 링크를 만들면 실패합니다.

섀도 링크는 링크를 만들기 전에 볼륨에 가상 경로가 있는 링크입니다. 이러한 가상 경로를 사용하여 링크를 만들면 백업 경로의 내용이 가상 경로에 표시되는 동안 가상 경로의 내용이 숨겨집니다. 예시:

  • C:\Foo는 두 개의 파일이 Cat.txt 디스크에 있으며 Dog.txt
  • C:\Bar는 두 개의 파일이 Cow.txt 디스크에 있으며 Mouse.txt

C:\Foo를 가상 경로로, C:\Bar를 백업 경로로 사용하여 링크를 만들면 C:\Foo 경로는 링크가 제거될 때까지 Cat.txt 및 Dog.txt 숨겨지는 동안 모든 사용자에게 Cow.txt 및 Mouse.txt 표시합니다.

다음 다이어그램의 또 다른 예제는 섀도 링크와 앵커리스 링크를 구분하는 데 도움이 됩니다.

Anchorless versus shadow bind links diagram

c:\Foo를 열거하는 사용자는 다이어그램에 표시된 바인딩 링크가 만들어지기 전에 디렉터리와 기존 콘텐츠를 찾습니다. 링크를 만든 후 c:\Foo를 열거하면 C:\Foo\Bar 및 Cow.txt 표시됩니다. C:\Foo는 링크가 있거나 없는 디스크에 있으므로 C:\Foo와 \\Remote\Target 사이의 링크는 섀도 링크입니다.

c:\Foo를 열거하는 사용자에게는 두 번째 바인딩 링크가 생성되기 전에 c:\Foo\Bar가 표시되지 않습니다. C:\Foo\Bar는 c:\Foo\Bar와 C:\Target2 사이의 링크가 추가된 후에만 표시되므로 순전히 가상이므로 c:\Foo\Bar와 C:\Target2 사이의 링크는 앵커리스 링크입니다.

이러한 두 유형의 링크에 대해 지원 경로의 보안 설명자가 적용됩니다.

사용자의 요구에 맞게 기본 동작을 변경하기 위해 특정 플래그를 전달할 수 있습니다.

병합된 링크는 가상 경로의 기존 콘텐츠가 지원 경로와 병합되는 것을 제외하고는 섀도 링크와 같습니다. 이러한 종류의 링크를 만들려면 CREATE_BIND_LINK_FLAG_MERGED 플래그를 사용해야 합니다.

이 플래그를 추가하여 섀도 링크에 대한 이전 예제를 다시 살펴보겠습니다.

예시:

  • C:\Foo는 두 개의 파일이 Cat.txt 디스크에 있으며 Dog.txt
  • C:\Bar는 두 개의 파일이 Cow.txt 디스크에 있으며 Mouse.txt

C:\Foo를 가상 경로로, C:\Bar를 플래그 CREATE_BIND_LINK_FLAG_MERGED 있는 백업 경로로 만든 경우 C:\Foo 경로는 Cat.txt, Dog.txt, Cow.txt 및 Mouse.txt 표시합니다.

병합된 링크는 가상 경로가 디렉터리인 경우에만 적용된다는 점을 기억해야 합니다. 백업 경로와 가상 경로 모두에 파일이 표시되는 경우 백업 경로의 파일이 우선합니다. 즉, 가상 경로의 파일이 마스킹됩니다. 가상 경로 내의 모든 디렉터리에 대해 재귀적으로 적용됩니다. 병합이 디렉터리에 적용되기 때문에 virtualPath와 backupPath에 같은 수준의 이름이 같은 디렉터리가 있는 경우 디렉터리가 링크의 결과로 병합됩니다. 링크가 병합된 링크가 아닌 경우 backupPath의 디렉터리가 우선적으로 적용되고 virtualPath 의 디렉터리를 재정의 합니다. 병합된 링크가 있을 때 병합된 경로에서 파일을 만든 경우 파일은 실제로 backupPath에서 만들어지고(바인딩 링크의 경우와 같이) virtualPath에서 동일한 이름의 파일을 재정의합니다.

다음 디렉터리 구조와 두 개의 서로 다른 링크를 살펴보겠습니다.

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

c:\Foo가 병합 없이 c:\Bar에 연결된 경우 c:\Foo\Sub는 Bar_sub.txt만 표시합니다. 그러나 c:\Foo가 병합을 사용하여 c:\Bar 연결된 경우 c:\Foo\Sub는 Foo_sub.txt 및 Bar_sub.txt 모두 표시합니다.

바인딩 링크는 경로 기반 링크이므로 링크가 만들어진 후 백업 경로에서 파일을 대체, 수정 또는 삭제/다시 만드는 경우 가상 경로는 링크를 따를 때 존재하는 파일을 가리킵니다. 이 문제는 파일이 열릴 때 링크가 확인되기 때문에 발생합니다. 따라서 백업 경로의 파일이 링크로 인해 가상 경로의 파일을 마스킹하고 백업 경로의 파일이 삭제된 경우 이후 파일 열기 요청이 가상 경로에서 열립니다.

읽기 전용 링크는 시스템의 사용자가 가상 경로를 통해 액세스하는 경우 백업 경로에 있는 파일을 변경하지 못하게 하는 바인딩 링크입니다. 즉, 백업 경로에서 파일을 수정할 수 있는 권한이 있는 사용자는 백업 경로를 통해 액세스하는 경우에도 해당 파일을 수정할 수 있지만 가상 경로를 통해 액세스하는 경우는 수정할 수 없습니다. 일반적으로 지원 경로의 사용 권한은 해당 가상 경로에 액세스할 때와 같이 적용되지만 CREATE_BIND_LINK_FLAG_READ_ONLY 플래그를 사용하는 경우 쓰기 권한이 마스킹됩니다. 이렇게 하면 애플리케이션에서 파일이 CREATE_BIND_LINK_FLAG_READ_ONLY 것을 확인할 수 있습니다.

읽기 전용 제한은 디스크의 지원 경로에 있는 파일에만 적용됩니다. 링크가 병합되고 원래 가상 디렉터리 경로에서 가져온 파일이 표시되면 다시 수정할 수 기본.

예시:

  • C:\Foo가 파일 Cat.txt 있는 디스크에 있음
  • C:\Bar는 파일 Cow.txt 디스크에 있습니다.

C:\Foo를 가상 경로로 만들고 C:\Bar를 백업 경로로 만들고 링크가 읽기 전용으로 표시되고 병합된 경우 Cat.txt 및 Cow.txt 모두 C:\Foo에 표시되지만 Cow.txt 수정할 수 없는 동안에는 Cat.txt 수정할 수 있습니다.

또한 이 API는 다른 여러 링크 시나리오를 지원합니다. 이들은 다음 섹션에 설명되어 있습니다.

바인딩 링크는 중첩될 수 있습니다. 즉, 가상 경로의 상위 항목 또는 하위 구성 요소는 자체 링크에 대한 가상 경로일 수도 있습니다.

이어지는 순환 링크에는 제한이 없습니다.

Nested bind links diagram

위의 "중첩된 바인딩 링크" 다이어그램에서 링크와 링크의 순서를 고려합니다.

C:\Foo\Bar와 같은 가상 경로를 사용하여 링크를 만드는 경우 C:\Foo를 가상 경로로 사용하여 다른 링크를 만들 수 있으며 C:\Foo\Bar\Baz를 가상 경로로 사용하여 다른 링크를 만들 수 있습니다.

예시:

  • C:\Target이 파일 Cat.txt 있는 디스크에 있음
  • C:\Target2는 파일 Dog.txt 디스크에 있습니다.
  • C:\Foo가 디렉터리 막대가 있는 디스크에 있음

C:\Foo\Bar가 C:\Target(Link1)에 연결된 다음 C:\Foo가 C:\Target2(Link2)에 연결된 경우 C:\Foo를 열거하는 사용자는 막대가 자체 링크의 가상 경로이므로 Dog.txt 및 디렉터리 막대가 표시됩니다. 이후에 C:\Foo\Bar\Baz가 C:\Target2(Link3)에 연결된 경우 Baz는 자체 링크의 가상 경로이므로 c:\Foo\Bar를 열거하는 사용자에게 Cat.txt 및 디렉터리가 표시됩니다.

다음 사항은 중요하며 링크 또는 링크 집합의 결과를 결정할 때 항상 함께 고려해야 합니다.

  1. 지원 경로는 항상 우선 순위를 지정하고 이름이 같은 엔터티가 가상 경로에 있거나 링크로 인해 존재하는 경우 재정의합니다. 이는 모든 종류의 바인딩 링크에 적용됩니다.

    예를 들어, 다음 링크를 고려하세요.

    c:\Foo는 c:\Target에 연결됩니다. 여기서 c:\Target은 파일입니다.

    이 경우 c:\Foo는 앵커리스 링크의 c:\Target 콘텐츠가 있는 파일처럼 보입니다. c:\Foo가 로컬(섀도 링크)에 있는 디렉터리인 경우에도 링크와 지원 경로가 있는 경우 위의 링크는 c:\Foo를 파일처럼 보이게 합니다.

  2. 링크가 충돌하는 경우 가장 최근에 만든 링크가 우선합니다. 그러나 가장 최근의 링크는 이전 링크를 숨길 수 없습니다.

    또 다른 예로, 다음 링크를 고려하십시오. 두 번째 링크는 네임스페이스의 보기를 변경합니다.

    • Link1: c:\Foo는 c:\Target에 연결됩니다. 여기서 c:\Target은 경로입니다. c:\Target에 파일 막대가 있음
    • Link2: c:\Foo\Bar는 c:\Target2에 연결됩니다. 여기서 Target2는 파일 Cat.txt 포함하는 디렉터리입니다.

    Order of bind links diagram

    이 경우 Link1을 만든 후 c:\Foo에 파일 막대가 있습니다. 그러나 Link2 이후 c:\Foo는 파일 Cat.txt 있는 디렉터리 막대를 표시합니다. 마찬가지로 c:\Target2가 파일인 경우 c:\Foo\Bar는 C:\Target2의 내용이 포함된 파일이 됩니다.

    반면에 아래와 같이 링크 순서가 반대로 바뀌면 c:\Foo\Bar는 c:\Target2의 Cat.txt 보여 주는 디렉터리로 계속 표시됩니다. 지원 경로는 가상 경로 아래의 항목보다 우선하지만 가상 경로 루트 자체보다 우선하지는 않습니다.

    • Link1: c:\Foo\Bar는 c:\Target2에 연결됩니다. 여기서 Target2는 파일 Cat.txt 포함하는 디렉터리입니다.
    • Link2: c:\Foo는 c:\Target에 연결됩니다. 여기서 c:\Target은 경로입니다. c:\Target에 파일 막대가 있음
  3. 링크를 성공적으로 만들려면 가상 경로의 부모가 로컬로 존재하거나 이전 링크의 backupPath로 인해 표시되거나 링크의 가상 경로 자체가 되어야 합니다.

    예를 들어 c:\Foo가 c:\Target에 먼저 연결된 다음 c:\Foo\Bar\Baz가 지원 경로에 연결된 경우 c:\Foo\Bar\Baz의 링크는 c:\Foo\Bar가 다음 조건 중 하나로 인해 존재하는 경우 성공합니다.

    • c:\Foo\Bar가 로컬로 존재하며 이전 링크의 예외로 인해 c:\Foo\Bar가 c:\Target에 의해 가려지지 않았는지 확인합니다(다음 섹션의 예외를 참조하세요) .
    • c:\Foo\Bar는 이전 링크(예: c:\Target에 디렉터리 막대가 있는 경우) 또는
    • c:\Foo\Bar는 다른 링크의 가상 경로 자체입니다(c:\Foo\Bar ==> something)

    참고 항목

    이는 중첩된 앵커리스 링크를 마지막으로 만드는 가장 깊은 링크와 함께 만들어야 한다는 것을 의미합니다. 그러나 가상 경로가 디스크에 이미 있으므로 섀도 링크에는 이러한 제한이 없습니다.

동일한 순서로 만든 다음 링크를 고려합니다.

  • C:\Foo가 C:\Target에 연결됨
  • C:\Foo\Bar가 c:\Target2에 연결됨

링크를 만드는 것은 지원 경로의 동작에 영향을 주지 않습니다. 따라서 가상 디렉터리 막대는 c:\Foo에 표시되고 c:\Target에는 표시되지 않습니다. 링크 테이블은 다음과 같습니다.

  • C:\Foo --> c:\Target, C:\Foo\Bar --> c:\Target2 and not
  • C:\Foo --> c:\Target, c:\Target\Bar --> c:\Target2

필요에 따라 생성된 링크의 범위를 제한하도록 예외를 지정할 수 있습니다. 예외 경로는 링크가 적용되지 않는 가상 경로의 하위 항목입니다. 예외 경로는 파일 또는 디렉터리일 수 있지만 가상 경로의 하위 경로여야 합니다. API를 사용하려면 링크를 만들 때 예외 경로에 액세스할 수 있어야 합니다. 예외 경로의 모든 하위 항목에 대해 예외가 적용됩니다. 예시:

  • C:\Foo는 디스크에 있으며 디렉터리 모음 및 디렉터리 Baz를 포함합니다.
  • C:\Foo\Bar에 Cat.txt 포함
  • C:\Foo\Baz에는 Dog.txt 포함됩니다.
  • C:\Target이 디스크에 있고 파일 Cow.txt 포함

C:\Foo\Baz에 대한 예외를 제외하고 C:\Foo에서 C:\Target으로 연결되는 링크가 만들어지면 사용자에게 다음이 표시됩니다.

  • C:\Foo에는 C:\Target의 Cow.txt 파일과 자식 Dog.txt 있는 디렉터리 Baz가 포함됩니다. C:\Foo\Bar는 링크에 의해 가려졌으므로 표시되지 않습니다.

다음 다이어그램은 위에서 설명한 시나리오를 나타냅니다.

Bind link exceptions diagram

마지막으로, 바인딩 링크 예외는 앵커리스 가상 경로에 정의에 의한 하위 항목이 없으므로 앵커리스 링크에 적용되지 않으므로 한정된 경로가 없습니다. 앵커리스 링크에 예외를 전달하려는 시도가 있는 경우 API는 오류를 반환합니다.

참고 항목

Bindlink 함수

Bindlink 열거형

Bindlink 예제