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

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

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

症状

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

位置不可用
<映射驱动器号>\ 是指不可用的位置。 它可能位于此计算机上的硬盘驱动器上,也可以位于网络上。 检查以确保磁盘已正确插入,或者已连接到 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 脚本使用任务计划程序来计划命令。 以下文档可帮助你对 Windows Vista 中可用的新功能和更新的功能进行排序。 它还提供了许多最佳做法来帮助你部署组策略。

    使用 Windows Vista 部署组策略

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

    在 Windows Vista 或更高版本的操作系统中启用用户帐户控制后,程序可能无法访问某些网络位置

更多信息

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

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

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

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