当获取符号链接的目标时,如何克服“符号链接类型已禁用,无法跟随”的错误?

60

在之前的问题(链接)后,我正在使用UNC路径从Vista机器创建一个指向Server 2008的符号链接。我可以很好地创建该链接,也可以转到Server 2008上并在资源管理器中双击链接以打开目标文件。然而,我无法使用FileCreateW获取到该UNC路径链接的句柄(来自Vista机器)。当我尝试时,它会失败,并返回错误代码1463 (0x5B7),其中包含以下信息:

由于其类型被禁用,因此无法跟随符号链接。

如何在Server 2008上启用其“type”(假设错误的意思就是它所说的)?


这很有用,我只想补充一点,即客户端以及托管符号链接的服务器都需要设置和启用R2R:1。 - Jamie Jackson
8个回答

73

我找到了答案,但要说它文档不好是轻描淡写了!

首先,这篇TechEd文章强调了用户可以“启用或禁用符号链接中可用的四个评估之一”。这四个“评估”包括远程到本地和本地到远程。它没有提供如何执行此操作的任何线索。

但是进一步搜索发现这个fsutil帮助页面实际上记录了如何“启用或禁用符号链接中可用的四个评估之一”。所以为了解决我遇到的问题,我需要在Vista机器上发出以下命令:

fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
为了在本地和远程计算机上允许完全访问符号链接所指向的位置。

1
这个页面里有一些更多关于fsutil的信息: http://technet.microsoft.com/en-us/library/cc785435(WS.10).aspx - ErJab

55

@David Arno的有益回答的基础上,根据W7:


fsutil.exe可以通过简单运行来显示它需要什么参数:

fsutil behavior set /?

要报告当前配置,请运行fsutil behavior query SymlinkEvaluation - 详见@Jake1164答案,尤其是关于可能控制行为的组策略

符号链接分辨率行为设置在访问给定链接的机器上,而不是托管它的机器上。

fsutil behavior set SymlinkEvaluation行为代码 - 即L2LL2RR2LR2R - 的意义如下:

  • L代表“本地”,R代表“远程”。
  • 2之前的第一个LR是相对于访问链接的计算机的链接本身的位置(而非其目标)。
  • 2之后的第二个LR是相对于链接本身所在的机器的链接目标的位置。

因此,例如,执行fsutil behavior set SymlinkEvaluation R2L意味着您可以访问:

  • 位于远程机器上的链接(R
  • 指向该远程机器上的目标(L

与David在Vista上遇到的情况不同,我在W7上能够通过仅启用R2R(而不必同时启用R2L)解析指向另一台远程机器的资源的远程链接。


所有评估类型为什么不是默认启用的,这是否有已知的原因? - stackprotector
很遗憾,我不知道@stackprotector - 它听起来像是与安全有关的东西。 - mklement0

14

我最近在我的所有企业Windows 7桌面上发现了这个问题,当我的一个旧程序停止工作时。经过一番搜索和找到这些设置后,我尝试通过命令行和注册表进行设置,但都没有缓解。

我发现您可以使用来自提升的提示的命令:

fsutil behavior query SymlinkEvaluation

这将返回这些链接的状态,而且在我这种情况下它们受到组策略的控制!感谢IT部门(你们这些混蛋)!

在此输入图像描述


1
那非常有帮助。谢谢。 - Oscar Ortiz
1
在GPO中,您可以在“计算机配置>管理模板>系统>文件系统”中更改它,并配置“有选择地允许符号链接的评估”。 - deru

8
这些设置也可以直接通过注册表进行操作:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,包括 SymlinkLocalToLocalEvaluation、SymlinkLocalToRemoteEvaluation、SymlinkRemoteToLocalEvaluation 和 SymlinkRemoteToRemoteEvaluation。
如果使用“fsutil behavior query SymlinkEvaluation”命令出现“is currently controlled by group policy”的消息,则请检查HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Filesystems\NTFS,或者在注册表中搜索“Symlink”。

更改HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Filesystems\NTFS 对我有帮助。 - Fernando Gabrieli

5
感谢David的提示,我已经开始绝望地修复这个问题,这使得符号链接几乎无用。
应该注意的是,Vista的默认配置是启用L2L和L2R,但禁用R2R和R2L。
我首先尝试只启用R2R,但这是不够的。还必须启用R2L。
接下来我要问的问题是:如何摆脱mklink命令中愚蠢的/D开关,以便从目标路径名类型自动推断默认链接类型!

2
默认的链接类型应该从目标路径名类型自动推断出来! 同意! - Fowl
由于链接可以指向链接本身,这将需要递归评估一直到根对象,在创建时,这将使符号链接在机器之间或甚至在同一台机器上也可能不可移植,如果另一个链接指向它。这就是符号链接的目的 - 它应该是一个运行时评估的通用引用。除非它是 UNC 路径,否则无法从目标类型推断出您想要什么,在 NTFS 的情况下,它必须是符号链接。所有其他情况都是模棱两可的。 - dodexahedron

4

这些设置也可以通过注册表直接进行操作(需要本地管理员权限进行编写):

注册表键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

注册表值(名称/数据对):

Name                             Type       Data  (1: Enabled; 0: Disabled)
-------------------------------------------------
SymlinkLocalToLocalEvaluation    REG_DWORD     1
SymlinkLocalToRemoteEvaluation   REG_DWORD     1
SymlinkRemoteToLocalEvaluation   REG_DWORD     1
SymlinkRemoteToRemoteEvaluation  REG_DWORD     1

官方文档很难找到,但这似乎是微软的官方页面:选择性允许符号链接的评估


不错的发现。你有任何微软文档的链接吗?如果你有的话,我认为值得添加。 - David Arno

2

如果你的电脑中有通过组策略控制 SymlinkEvaluation 设置,你仍然可以通过命令行自己设置。这些设置会在下一次重启或登录时被组策略覆盖,但是在你的用户会话期间,你的设置将起作用。

因此,如果你需要将其设置为与组策略不同的值,甚至可以在登录时运行一个脚本,在应用组策略后再进行设置。


GP 不仅在每次重新启动/登录时更新,它们默认情况下每 90 (+30) 分钟更新一次。 - stackprotector

1

远程连接点默认情况下可以工作。对于文件,您仍然需要符号链接。


在R2R的情况下,连接点对性能不利,因为所有流量都会路由到包含连接点的服务器上。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接