本文解决 尝试从映射驱动器复制文件时位置不可用 错误。
原始 KB 数: 2019185
现象
启用用户帐户控制(UAC)后,尝试将文件从映射驱动器复制到本地目录时,可能会收到以下错误:
无法获取位置 <映射驱动器号>\ 指不可用的位置。 它可以位于此计算机上的硬盘驱动器上,也可以位于网络上。 检查以确保磁盘已正确插入,或者已连接到 Internet 或网络,然后重试。 如果仍无法找到该信息,则信息可能已移动到其他位置。
原因
根本原因在于 UAC 及其与拆分令牌机制的交互。 当管理员登录到启用了管理员审批模式(AAM)的计算机时,将向用户授予两个访问令牌:
- 具有完整管理员访问权限的令牌
- 已筛选的标准用户访问令牌
默认情况下,当本地管理员组的成员登录时,将禁用管理 Windows 权限并删除提升的用户权限。 这会生成标准用户访问令牌。 然后,标准用户访问令牌用于启动桌面(Explorer.exe)。 Explorer.exe 是父进程,用户启动的其他所有进程都将从该进程继承访问令牌。 因此,默认情况下,所有应用程序都以标准用户身份运行,除非用户提供同意或凭据来批准应用程序以使用完全管理访问令牌。 与此过程形成鲜明对比的是,当标准用户登录时,只会创建标准用户访问令牌。 然后,此标准用户访问令牌用于启动桌面。
必须满足以下条件才能发生错误:
- 使用 AAM 启用 UAC。
- 用户不会以本地计算机的管理员身份登录,也不会使用域管理员帐户凭据登录。
- 驱动器使用标准用户安全上下文进行映射。
- 用户对目标目录没有创建/写入 NTFS 权限。
用户已在 Windows 资源管理器中使用 “映射网络驱动器 ”选项或通过在非提升的命令提示符中运行 net use 命令来映射驱动器。 通过以标准用户身份在未提升权限的命令提示符中运行 net use,可以看到映射的驱动器。 在这种情况下,驱动器已映射为标准用户。
C:\Users\johnsmith>net use
New connections will be remembered.
Status Local Remote Network
-------------------------------------------------------------------------------
OK X: [\\contoso-dc1\d$](file:/contoso-dc1/d$) Microsoft Windows Network
The command completed successfully.
在提升权限的命令提示符中运行同一命令时,不会列出任何映射驱动器。
C:\Windows\system32>net use
New connections will be remembered.
There are no entries in the list.
这清楚地表明,提升权限的会话看不到标准用户映射的驱动器。 因此,它无法完成复制操作。 此行为是特意这样设计的。
注意
默认情况下,为属于本地管理员组成员的帐户启用 AAM。 可以在“安全设置”下的**“本地策略安全选项”节点中找到该设置**,并使用本地组策略编辑器(secpol.msc)和组策略管理控制台(GPEDit.msc)进行配置。 有关 UAC 的详细信息,请参阅 用户帐户控制。
解决方法
-
使用提升权限的进程映射驱动器。 但 Windows 资源管理器看不到提升的驱动器映射。 有关详细信息,请参阅“ 详细信息 ”部分。
-
使用 UNC 路径连接到网络资源,例如 \server\share。
-
使用组策略首选项映射驱动器。 下面引用的白皮书介绍了组策略首选项,这是 Windows Server 2008 中的一项新功能。 白皮书介绍如何使用组策略首选项更好地部署和管理操作系统和应用程序设置。 使用组策略首选项可以配置、部署和管理以前无法使用组策略管理的操作系统和应用程序设置。 示例包括映射驱动器、计划任务和开始菜单设置。 对于许多类型的操作系统和应用程序设置,使用组策略首选项比在 Windows 映像中配置它们或使用登录脚本更合适。
-
使用调用 launchapp.wsf 脚本并通过任务计划程序安排这些命令的登录脚本来映射驱动器。 以下文档可帮助你对 Windows Vista 中提供的新功能和更新功能进行排序。 它还提供了许多最佳做法来帮助你部署组策略。
-
以下文章介绍了一种不支持的方法,该方法通过配置
EnableLinkedConnections注册表值来还原前面所述的安全更改。 此值使 Windows Vista 能够在筛选的访问令牌与管理员组成员的完全管理员访问令牌之间共享网络连接。 配置此注册表值后,LSA 将检查是否将另一个访问令牌与当前用户会话相关联(如果网络资源映射到访问令牌)。 如果 LSA 确定存在链接访问令牌,则会将网络共享添加到链接位置。
详细信息
当管理用户账户登录时,Windows 会使用提升令牌处理登录脚本。 该脚本实际上确实能运行,并且能够映射该驱动器。 但是,Windows 会阻止显示已映射的网络驱动器,因为桌面使用的是筛选令牌,而这些驱动器是使用提升的(完整管理员)令牌映射的。
在 Windows 2000 SP2 之前,设备名称(例如映射驱动器)在显式删除或系统重启之前保持全局可见。 出于安全原因,我们修改了从 Windows 2000 SP2 开始的此行为。 从这一点起,所有设备都与身份验证 ID(LUID)相关联。 LUID 是为每个登录会话生成的 ID。 在 LocalSystem 上下文中运行的进程可以在全局设备命名空间中创建设备名称,尽管本地命名空间对象可以隐藏全局命名空间对象。
这些映射驱动器与 LUID 相关联。 而提升权限的应用程序使用的是在另一次单独登录事件中生成的另一个 LUID。 因此,提权后的应用程序将无法再识别到该用户的任何映射驱动器。 你会注意到以前使用 RunAs 或 CreateProcessAsUser API 的相同行为,但 UAC 会显著增加将使用这些概念的用户数。
结果是,如果提升命令提示符,将不再看到从原始登录名创建的任何本地命名空间映射驱动器(无论是使用 API 还是通过登录脚本 WNetAddConnection 创建)。 对于从 Windows 资源管理器启动的情况,已有相应的缓解措施。 如果你双击一个被识别为安装文件或其清单声明为 requireAdministrator 的可执行文件,Windows 可以检测到它是以提升权限运行的,并且出现了“找不到路径”的错误,然后将该驱动器映射从原始 LUID 复制过来。 但是,这是唯一自动化的方案。