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


症状


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

位置不可用

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

原因


基本原因是 UAC 以及与拆分令牌的交互。 当管理员登录到启用了管理员批准模式的计算机(AAM)时,将向该用户授予两个访问令牌: "完全管理员访问令牌" 和 "筛选的标准用户访问令牌"。 默认情况下,当本地管理员组的成员登录时,将禁用管理 Windows 权限并删除提升的用户权限,从而导致标准用户访问令牌。 然后使用标准用户访问令牌启动桌面(Explorer)。 Explorer 是父进程,所有其他用户启动的进程都将继承其访问令牌。 因此,默认情况下,所有应用程序都作为标准用户运行,除非用户提供同意或凭据来批准应用程序以使用完整的管理访问令牌。 对比此过程,当标准用户登录时,仅创建标准用户访问令牌。 然后使用此标准用户访问令牌启动桌面。

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

  1. 已通过 AAM 启用 UAC。
  2. 用户未作为本地计算机管理员或域管理员帐户凭据登录。
  3. 使用标准用户安全上下文映射驱动器。
  4. 用户在目标目录上没有创建/写入 NTFS 权限。

用户使用 Windows 资源管理器中的 "映射网络驱动器" 选项或通过在未提升的命令提示符下运行net use命令来映射驱动器。 通过从非提升的命令提示符下将 net 用作标准用户,可查看映射的驱动器。 在这种情况下,该驱动器作为标准用户进行映射。

将记住 C:\Users\johnsmith>net useNew 连接。

状态本地远程网络

-------------------------------------------------------------------------------OK X: \\contoso-dc1\d $ Microsoft Windows 网络

命令已成功完成。

在提升的命令提示符下运行相同的命令(选择 "以管理员身份运行"),不会列出映射驱动器。

将记住 C:\Windows\system32>net useNew 连接。

列表中没有条目。

这明显表明,提升的会话不会看到标准用户的映射驱动器,因此无法完成复制操作。 这是设计的行为。

注意:

默认情况下,将为本地管理员组成员的帐户启用 AAM。 该设置可以在本地策略的 "安全选项" 节点中的 "安全设置" 下找到,并且可以通过 "本地组策略编辑器" (Secpol)和组策略管理控制台(GPMC)(gpedit.msc)进行配置。 有关 UAC 的详细信息,请参阅以下文章。

用户帐户控制
http://technet.microsoft.com/en-us/library/cc772207(WS.10).aspx

解决方案


  1. 使用提升的进程映射驱动器。但是,Windows 资源管理器将看不到提升的驱动器映射。有关进一步的详细信息,请参阅详细信息部分。 在 Windows 7 用户帐户控制中 http://technet.microsoft.com/en-us/magazine/2009.07.uac.aspx  
  2. 使用 UNC 路径连接到网络资源,例如\\server\share  
  3. 使用组策略首选项映射驱动器。下面引用的白皮书介绍了组策略首选项、Windows Server 2008 中的新增功能,并介绍了如何使用组策略首选项来更好地部署和管理操作系统和应用程序设置。组策略首选项允许你配置、部署和管理操作系统和应用程序设置你以前无法使用组策略进行管理。示例包括映射的驱动器、计划的任务和 "开始" 菜单设置。对于许多类型的操作系统和应用程序设置,使用组策略首选项是在 Windows 映像中或使用登录脚本配置它们的更好方法。 组策略首选项概述
  4. 使用使用launchapp脚本的登录脚本映射驱动器使用 "任务计划程序" 安排命令。下面的文档可帮助你对 Windows Vista 中提供的新功能和更新功能进行排序,并提供了一些最佳做法来帮助你部署组策略。 使用 Windows Vista 部署组策略 http://technet.microsoft.com/en-us/library/cc766208(WS.10).aspx  
  5. 以下知识库文章介绍了一个不受支持的方法,该方法可恢复 configuring 的EnableLinkedConnections注册表值之前的安全更改。此值使 Windows Vista 能够在筛选的访问令牌和管理员组成员的完全管理员访问令牌之间共享网络连接。配置此注册表值后,如果网络资源映射到访问令牌,LSA 将检查是否存在与当前用户会话相关联的其他访问令牌。如果 LSA 确定存在链接的访问令牌,它会将网络共享添加到链接位置。 937624在 Windows Vista 中启用用户帐户控制后,程序可能无法访问某些网络位置

更多信息


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

在 Windows 2000 SP2 之前,设备名称(如映射的驱动器)在全局可见的情况下仍然可见,直到系统重新启动。 出于安全考虑,我们从 Windows 2000 SP2 开始修改此行为。 从此处开始,所有设备都与身份验证 ID (LUID)相关联,该 ID 是为每个登录会话生成的 ID。 (在 LocalSystem 上下文中运行的进程可以在全局设备命名空间中创建设备名称,但本地命名空间对象可以隐藏全局命名空间对象。)

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

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