将文件从映射驱动器复制到本地目录失败,出现错误 (如果启用了 UAC,则位置不可用)
本文解决了尝试从映射驱动器复制文件时 位置不可用 的错误。
适用于: Windows Server 2012 R2
原始 KB 编号: 2019185
症状
启用用户帐户控制 (UAC) 后,尝试将文件从映射驱动器复制到本地目录时,可能会收到以下错误:
位置不可用
<映射的驱动器号>\ 是指不可用的位置。 它可能位于此计算机或网络上的硬盘驱动器上。 检查以确保磁盘已正确插入或已连接到 Internet 或网络,然后重试。 如果仍然无法找到该信息,则可能已将信息移动到其他位置。
原因
根本原因是 UAC 和与拆分令牌的交互。 当管理员登录到启用了管理员审批模式 (AAM) 的计算机时,将向用户授予两个访问令牌:
- 完整的管理员访问令牌
- 筛选的标准用户访问令牌
默认情况下,当本地管理员组的成员登录时,将禁用管理 Windows 权限,并删除提升的用户权限。 它生成标准用户访问令牌。 然后使用标准用户访问令牌启动桌面 (Explorer.exe) 。 Explorer.exe是所有其他用户发起的进程从中继承其访问令牌的父进程。 因此,所有应用程序默认以标准用户身份运行,除非用户提供同意或凭据,以批准应用程序使用完整的管理访问令牌。 与此过程相比,当标准用户登录时,只会创建标准用户访问令牌。 然后,此标准用户访问令牌用于启动桌面。
必须满足以下条件才能发生错误:
- 使用 AAM 启用了 UAC。
- 用户不会以本地计算机的管理员身份或域管理员帐户凭据登录。
- 驱动器使用标准用户安全上下文进行映射。
- 用户对目标目录没有创建/写入 NTFS 权限。
用户已使用 Windows 资源管理器中的 “映射网络驱动器 ”选项或在非提升的命令提示符下运行 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 的详细信息,请参阅 用户帐户控制。
解决方案
使用提升的进程映射驱动器。 但 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 开始修改了此行为。 从现在起,所有设备都与 LUID) (身份验证 ID 相关联。 LUID 是为每个登录会话生成的 ID。 在 LocalSystem 上下文中运行的进程可以在全局设备命名空间中创建设备名称,尽管本地命名空间对象可以隐藏全局命名空间对象。
这些映射驱动器与 LUID 相关联。 提升的应用程序使用在单独登录事件中生成的不同 LUID。 因此,提升的应用程序将不再看到此用户的任何映射驱动器。 你会注意到以前使用的 RunAs
相同行为或 CreateProcessAsUser
API,但 UAC 会显著增加将使用这些概念的用户数。
结果是,如果提升命令提示符,则将不再看到从原始登录名创建的任何本地命名空间映射驱动器 (是通过登录脚本创建的、使用 API 还是以 WNetAddConnection
其他方式) 。 对于从 Windows 资源管理器启动的方案,有一个缓解措施。 如果双击检测为安装文件或显示为 requireAdministrator 的可执行文件,Windows 可以检测到该文件已提升,并且存在一个错误,指示找不到路径,并从原始 LUID 复制该驱动器映射。 但是,这是唯一自动化的方案。