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

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

原始 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)和组策略管理控制台(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 开始的此行为。 从这一点起,所有设备都与身份验证 ID(LUID)相关联。 LUID 是为每个登录会话生成的 ID。 在 LocalSystem 上下文中运行的进程可以在全局设备命名空间中创建设备名称,尽管本地命名空间对象可以隐藏全局命名空间对象。

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

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