分布式链接跟踪和对象标识符

使用文件或目录的路径和文件名存储对目录的引用是不可靠的。 如果用户重命名文件,则会中断指向该文件的链接。 如果用户重命名目录,则会中断指向文件以及目录树中的所有文件和子目录的链接。

分布式链接跟踪服务使客户端应用程序能够跟踪已移动的链接源。 订阅链接跟踪服务的客户端可以维护其引用的完整性,并且可以以对用户透明的方式跟踪对象。

对象标识符

链接跟踪服务通过使用对象 标识符 (ID) 来维护其指向对象的链接。 对象 ID 是一个可选属性,用于唯一标识卷上的文件或目录。

所有对象 ID 的索引存储在卷上。 重命名、备份和还原操作会保留对象 ID。 但是,复制操作不会保留对象 ID,因为这会违反其唯一性。

可以对对象 ID 执行以下操作:

  • 创建
  • 删除
  • 查询

创建对象 ID 时,需将文件标识建立到链接跟踪服务。 相反,删除对象 ID 时,链接跟踪服务将停止维护指向该文件的链接。 有关对对象 ID 执行操作的文件系统控制代码的列表,请参阅 文件管理控制代码

分布式链接跟踪服务跟踪 NTFS 文件系统卷中 shell 快捷方式和 OLE 链接的链接源。 链接客户端可以使用有关链接源新位置的更新信息修复断开的链接。

Shell 快捷方式包括启发式链接跟踪,该跟踪使用树搜索算法查找移动链接源的匹配项。 搜索算法基于文件和文件信息的最后已知路径,其中包括创建日期、文件大小以及文件名和扩展名。

OLE 链接包括相同的启发式链接跟踪。 Windows 还包括相同的启发式链接跟踪,并增加了一些针对搜索名称空间的改进,以在某些常见方案中产生结果。 这些改进包括以下过程,该过程取决于客户端应用程序施加的时间限制。

搜索名称空间

  1. 从最后一个目录向下搜索四个目录级别。
  2. 向上移动一个目录,再重复步骤 1 和 2 三次,如果对象移动到附近,可能会产生结果。
  3. 从桌面根目录向下搜索四个级别,如果对象已移动到同一桌面上的某个位置,则可能会生成结果。
  4. 从每个本地固定驱动器的根目录向下搜索四个级别。
  5. 重复步骤 1-3,没有四个目录限制。

注意

这些链接跟踪方案对最终用户是透明的。 但是,它们并不总是产生积极的结果,并且可能很耗时。

 

有关 shell 快捷方式的详细信息,请参阅 IShellLink

有关 OLE 链接的详细信息,请参阅 IOleLink

如果链接到 NTFS 3.0 或更高版本上的文件,并将该文件移动到同一域中具有 NTFS 3.0 或更高版本的任何其他卷,则跟踪服务可以根据时间注意事项找到该文件。 此外,如果文件移动到域外部或工作组内,则会找到该文件。

若要获取卷的 NTFS 版本,请使用管理员访问权限打开命令提示符并执行以下命令:

fsutil fsinfo ntfsinfoX

其中 X 是卷的驱动器号。

创建指向文件的链接时,目标文件被视为 链接源,链接的创建者是 链接客户端。 例如,如果创建了链接到文本文档的 shell 快捷方式,则文本文档是链接源,而 shell 快捷方式是链接客户端。

分布式链接跟踪服务为域中发生的以下情况维护文件链接:

  • 链接源文件从一个 NTFS 文件系统卷移动到同一域中的另一个。
  • 保存链接源的计算机的名称已重命名。
  • 链接源计算机上的网络共享已更改。
  • 保存链接源文件的卷将移动到同一域中的另一台计算机。

分布式链接跟踪服务还会尝试在上述情况下维护链接,即使这些链接不在域中发生(即跨域或工作组内)。 在链接源计算机上的网络共享发生更改的情况下,始终可以维护链接。 当链接源在计算机中移动时,也可以维护它们。 链接源移动到另一台计算机时,通常可以维护链接,但随着时间的推移,这种形式的跟踪不太可靠。

链接跟踪功能主要以以下两个系统服务的形式实现:

  • 分布式链接跟踪客户端
  • 分布式链接跟踪服务器

分布式链接跟踪客户端

分布式链接跟踪客户端在所有计算机上运行,并管理该计算机的链接跟踪活动。 这些活动包括搜索链接源和处理链接源移动。 移动链接源时,服务会将信息传递给域控制器上运行的分布式链接跟踪服务器。

分布式链接跟踪服务器

分布式链接跟踪服务器在域中的每个域控制器上运行。 该服务接受来自计算机上的跟踪服务的文件和卷移动的通知,并允许分布式链接跟踪客户端查询链接源的当前位置。

此服务器服务在域控制器中维护有关已移动的卷和文件的信息。 有关移动的信息不能超过特定大小,如果变得不必要,将自动删除。

链接跟踪服务由 IShellLinkIOleLink 接口公开。 因此,它们由 shell 快捷方式使用。 调用 IShellLink::Resolve 方法且找不到引用文件时,例如,当用户激活 shell 快捷方式时,会自动调用跟踪服务来查找该文件。 同样,当 IOleLink 实现找不到文件(例如在其 BindToSource 方法中)时,它会自动调用跟踪服务。

分布式链接跟踪服务仅在 NTFS 文件系统上可用,并且仅适用于 NTFS 3.0 或更高版本上的链接源。 因此,如果将链接源移动到 FAT 文件系统卷,跟踪信息将丢失。 此外,如果链接源在 NTFS 3.0 或更高版本之间移动,但执行移动的计算机正在运行早期版本的 Windows,则链接跟踪信息将丢失。 当链接跟踪信息丢失时,不会对链接源文件本身造成损害,分布式链接跟踪服务根本无法跟踪它。

若要获取卷的 NTFS 版本,请使用管理员访问权限打开命令提示符并执行以下命令:

fsutil fsinfo ntfsinfoX

其中 X 是卷的驱动器号。

不会保留指向可移动媒体上的文件的链接。 此外,在重新启动系统之前,跟踪服务无法识别新的 NTFS 文件系统卷。 新卷可能因重新分区、将 FAT 文件系统卷重新格式化到 NTFS 文件系统或连接新的外部驱动器而变得可用。