将文件从映射驱动器复制到本地目录失败,并出现错误 (启用 UAC) 位置不可用

本文解决了尝试从 映射驱动器 复制文件时"位置不可用"错误。

适用于:  Windows Server 2012R2
原始 KB 编号:   2019185

症状

启用用户帐户控制 (UAC) 时,在尝试将文件从映射驱动器复制到本地目录时,可能会收到以下错误:

位置不可用
<mapped drive letter>\ 表示不可用的位置。 它可以在此计算机的硬盘驱动器上或网络上。 请检查以确保磁盘正确插入,或者已连接到 Internet 或您的网络,然后重试。 如果仍无法定位,则信息可能已被移动到其他位置。

原因

根本原因是 UAC 和拆分令牌的交互。 当管理员使用管理员审批模式登录启用了 AAM (计算机) ,将授予用户两个访问令牌:

  • 完全管理员访问令牌
  • 已筛选的标准用户访问令牌

默认情况下,当本地用户管理员组登录时,管理Windows权限将被禁用,并且提升的用户权限将被删除。 它生成标准用户访问令牌。 然后,使用标准用户访问令牌启动桌面 (Explorer.exe) 。 Explorer.exe是所有其他用户启动的进程从其继承其访问令牌的父进程。 因此,除非用户同意或凭据批准应用程序使用完整的管理访问令牌,否则默认情况下,所有应用程序都作为标准用户运行。 与此过程相反,当标准用户登录时,只会创建标准用户访问令牌。 然后,此标准用户访问令牌用于启动桌面。

必须满足以下条件,错误发生:

  1. 使用 AAM 启用 UAC。
  2. 用户不是以本地计算机的管理员身份或域管理员帐户凭据登录的。
  3. 使用标准用户安全上下文映射驱动器。
  4. 用户对目标目录没有创建/写入 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) 和组策略管理控制台 (GPMC) (gpedit.msc) 进行配置。 有关 UAC 详细信息,请参阅 用户帐户控制

解决方案

  1. 使用提升的进程映射驱动器。 但是Windows资源管理器不会看到提升的驱动器映射。 有关详细信息,请参阅详细信息部分。

    内部 Windows 7 用户帐户控制

  2. 使用 UNC 路径连接到网络资源,例如 \ \server\share。

  3. 使用组策略首选项映射驱动器。 下面引用的白皮书介绍了组策略首选项,这是 Windows Server 2008 中的一项新功能。 该白皮书介绍如何使用组策略首选项更好地部署和管理操作系统和应用程序设置。 组策略首选项允许你配置、部署和管理以前无法使用组策略管理的操作系统和应用程序设置。 示例包括映射驱动器、计划任务和"开始"菜单设置。 对于许多类型的操作系统和应用程序设置,使用组策略首选项是在映像中使用登录脚本Windows配置它们更好的替代方法。

    组策略首选项概述

  4. 使用 launchapp.wsf 脚本的登录脚本映射驱动器,以使用任务计划程序计划命令。 下面的文档可帮助您浏览 Vista 中提供的新增Windows功能。 它还提供了许多最佳做法来帮助你部署组策略。

    使用 Vista 部署Windows策略

  5. 以下文章介绍一种不受支持的方法,该方法通过配置注册表值来还原前面 EnableLinkedConnections 所述的安全更改。 此值使 vista Windows在已筛选的访问令牌和成员的完整管理员访问令牌之间共享管理员组。 配置此注册表值后,如果网络资源映射到访问令牌,LSA 将检查另一个访问令牌是否与当前用户会话关联。 如果 LSA 确定存在链接的访问令牌,它将网络共享添加到链接位置。

    在 Vista 或较新的操作系统中打开用户帐户控制后,程序Windows某些网络位置

更多信息

当管理用户登录时,Windows提升的令牌处理登录脚本。 脚本实际上可以运行并映射驱动器。 但是,Windows阻止映射网络驱动器的视图,因为桌面使用已筛选的令牌,而驱动器使用提升的 (完全管理员令牌) 映射。

在 Windows 2000 SP2 之前,设备名称 (例如,映射的驱动器) 在显式删除或重新启动系统之前保持全局可见。 出于安全考虑,我们修改了从 Windows 2000 SP2 开始的行为。 从此时开始,所有设备都与 LUID (身份验证 ID) 。 LUID 是每个登录会话生成的 ID。 在 LocalSystem 上下文中运行的进程可以在全局设备命名空间创建设备名称,尽管本地命名空间对象可以隐藏全局命名空间对象。

这些映射驱动器与 LUID 关联。 提升的应用程序在单独的登录事件期间使用不同的 LUID。 因此,提升的应用程序将不再看到此用户的任何映射驱动器。 你将注意到之前使用 或 API 的相同行为,但 UAC 显著增加了将使用这些概念 RunAs CreateProcessAsUser 的用户数量。

结果是,如果你提升命令提示符,你将不会再看到从原始登录文件创建的任何本地命名空间映射驱动器 (无论是通过登录脚本、使用 API 还是通过其他方式 WNetAddConnection) 。 对于从浏览器启动的方案,我们Windows缓解措施。 如果双击被检测为安装文件或清单为 requireAdministrator 的可执行文件,Windows 可以检测到它已提升,并且存在指示找不到路径的错误,然后从原始 LUID 复制该驱动器映射。 但是,这是自动执行的唯一方案。