示例场景:我想c:\temp
指向每个用户的临时目录,即使多个用户同时登录。
我可以在用户登录期间运行代码,例如,使用登录脚本、运行键等,但它必须适用于非管理用户。
这是本地 DOS 设备命名空间的工作!
在用户登录期间,创建指向临时文件夹的设备名称:
DefineDosDevice(DDD_RAW_TARGET_PATH, L"TempFolder", L"\??\C:\<path>");
然后,您可以作为管理用户登录并创建联结点或符号链接。例如:
mklink /J c:\temp \\?\TempFolder
几点注意事项:
您不能为当前登录会话中既不存在又不指向本地驱动器的设备名称创建连接点。因此,请确保在尝试创建连接点之前创建设备名称。(这不适用于符号链接。)
如果启用了 UAC,管理员将有两个登录会话,一个是提升的,一个是受限的。如果您希望链接在两个会话中都有效,您必须在两个会话中创建设备名称。
设备名称路径不应包含尾部反斜杠。
您不能阻止用户在他们自己的登录会话中重新定义文件夹指向的位置。所以这不能成为安全机制的一部分。
如果正在备份文件系统,您应该测试这种连接点/符号链接的存在是否会破坏备份软件。大多数备份软件不会尝试跟踪连接点或符号链接,因此通常应该没问题。(但是,如果设备名称不存在,则连接点或符号链接的恢复操作可能会失败。)
据我所知,创建连接点时我需要使用\\?\
格式(而不是\??\
)的唯一原因是该mklink
命令将后者误解为相对路径。如果您在代码中创建连接点,您可能可以使用其中任何一个。有关更多上下文,另请参阅“路径前缀 \??\ 和 \?\”。
本地 DOS 设备名称空间似乎是 per-remote-desktop-session 以及 per-logon-session。在正常情况下,这无关紧要,但我不确定如果你正在做一些奇怪的事情,比如显式更改令牌的远程桌面会话,会发生什么。