如何为不同的用户将连接点或符号链接指向不同的位置?

How can I make a junction point or symlink point to a different place for different users?

示例场景:我希望c:\temp指向每个用户的临时目录,即使多个用户同时登录也是如此。

我可以 运行 在用户登录期间编写代码,例如,使用登录脚本、运行 键等,但它必须适用于非管理员用户。

这是 local DOS devices namespace 的工作!

在用户登录期间,创建一个指向临时文件夹的设备名称:

DefineDosDevice(DDD_RAW_TARGET_PATH, L"TempFolder", L"\??\C:\<path>");

然后您可以作为管理用户登录并创建连接点或 symlink。例如:

mklink /J c:\temp \?\TempFolder

一些注意事项:

  • 您不能为既不存在于当前登录会话中又不指向本地驱动器的设备名称创建连接点。因此,请确保在尝试创建连接点之前创建设备名称。 (这不适用于 symlinks。)

  • 如果启用 UAC,管理员将有两个登录会话,一个提升的和一个受限的。如果您希望 link 在两个会话中工作,您必须在两个会话中创建设备名称。

  • 设备名称路径不应包含尾随反斜杠。

  • 您不能阻止用户在他们自己的登录会话中重新定义文件夹指向的位置。所以这不能成为安全机制的一部分。

  • 如果正在备份文件系统,你应该测试这样一个连接点/symlink的存在是否会破坏备份软件。大多数备份软件不会尝试跟踪连接点或 symlinks,因此通常应该没问题。 (但是,如果设备名称不存在,则连接点或 symlink 的还原操作可能会失败。)

  • 据我所知,在创建连接点时我需要使用 \?\ 格式(而不是 \??\)的唯一原因是 mklink 命令将后者误解为相对路径。如果您在代码中创建连接点,您可能可以使用其中任何一个。有关更多上下文,另请参阅 "Path prefixes \??\ and \?\".

  • 本地 DOS 设备名称空间似乎是每个远程桌面会话以及每个登录会话。在正常情况下,这无关紧要,但我不确定如果您正在做一些奇怪的事情,比如显式更改令牌的远程桌面会话,会发生什么。