示例场景:我希望c:\temp
指向每个用户的临时目录,即使多个用户同时登录也是如此。
我可以在用户登录期间运行代码,例如,使用登录脚本,运行密钥等,但它必须适用于非管理用户。
答案 0 :(得分:2)
这是local DOS devices namespace的作业!
在用户登录期间,创建指向临时文件夹的设备名称:
DefineDosDevice(DDD_RAW_TARGET_PATH, L"TempFolder", L"\??\C:\<path>");
然后,您可以以管理用户身份登录并创建联结点或符号链接。例如:
mklink /J c:\temp \\?\TempFolder
一些注意事项:
您无法创建与当前登录会话中不存在且指向本地驱动器的设备名称的联结点。因此,请确保在尝试创建联结点之前创建设备名称。 (这不适用于符号链接。)
如果启用了UAC,管理员将有两个登录会话,一个是提升的,一个是限制的。如果您希望链接在两个会话中都有效,则必须在两个会话中创建设备名称。
设备名称路径不应包含尾部反斜杠。
您无法阻止用户重新定义文件夹在其自己的登录会话中指向的位置。所以这不能成为安全机制的一部分。
如果正在备份文件系统,则应测试是否存在此类联结点/符号链接会破坏备份软件。大多数备份软件不会尝试遵循连接点或符号链接,因此通常应该没问题。 (但是,如果设备名称不存在,则联结点或符号链接的还原操作可能会失败。)
尽我所知,创建联结点时我需要使用\\?\
格式(而不是\??\
)的唯一原因是mklink
命令将后者误解为相对路径。如果要在代码中创建联结点,则可以使用其中任何一个。有关更多背景信息,另请参阅"Path prefixes \??\ and \?\"。
本地DOS设备命名空间似乎是每个远程桌面会话以及每个登录会话。在正常情况下,这无关紧要,但我不确定如果您正在做一些奇怪的事情,例如明确更改令牌的远程桌面会话,会发生什么。