深入了解Windows Vista用户帐户控制
图 4 显示 UAC 文件虚拟化筛选器驱动程序 (%SystemRoot%\System32\Drivers\Luafv.sys) 如何实施文件系统虚拟化。因为它是文件系统筛选器驱动程序,所以它会看到所有文件系统操作,但是仅为来自旧进程的操作实施功能。您可以看到它为在系统全局位置创建文件的旧进程更改了目标文件路径,但是没有为以标准用户权限运行 Windows Vista 应用程序的进程进行此更改。当它确实在用户具有完全访问权限的位置创建了文件时,旧进程便认为操作成功,但在 \Windows 目录上的默认权限会拒绝对为 Windows Vista 编写的应用程序的访问。

图 4 文件系统虚拟化
注册表虚拟化的实施与文件系统虚拟化略有不同。虚拟化的注册表项包括 HKEY_LOCAL_MACHINE\Software 分支的大部分,但有许多例外项,例如以下项:
HKLM\Software\Microsoft\Windows
HKLM\Software\Microsoft\Windows NT
HKLM\Software\Classes
只有通常由旧应用程序修改,但不会带来兼容性或互操作性问题的项才能虚拟化。Windows 将旧应用程序对虚拟化项的修改重定向到位于 HKEY_ CURRENT_USER\Software\Classes\VirtualStore 的用户注册表虚拟根目录。该项位于用户的 Classes 配置单元 %LocalAppData%\Microsoft\Windows\UsrClass.dat 中,与任何其他虚拟化文件数据一样,它并不随漫游用户配置文件漫游。
图 2 “任务管理器”显示虚拟化状态
与 Windows 为文件系统维护一个固定虚拟化位置列表不同,注册表项的虚拟化状态作为一个标志 REG_ KEY_DONT_VIRTUALIZE 存储在该项自身。Reg.exe 实用工具可以显示该标志以及另外两个虚拟化相关标志:REG_KEY_ DONT_SILENT_FAIL 和 REG_KEY_ RECURSE_FLAG,如图 5 所示。当设置了 REG_KEY_DONT_SILENT_FAIL 并且该项未虚拟化(已设置 REG_KEY_DONT_VIRTUALIZE)时,除了应用程序请求的访问外,原本被拒绝对该项执行操作访问的旧应用程序还将被授予用户对该项所拥有的任何访问权限。REG_KEY_RECURSE_FLAG 表明新的子项是否继承父项的虚拟化标志,而不仅仅是默认标志。

图 5 Reg 实用工具显示虚拟化标志
图 6 显示了配置管理器如何实施注册表虚拟化,该管理器管理操作系统内核 Ntoskrnl.exe 中的注册表。对于文件系统虚拟化,创建虚拟化项的子项的旧进程将被重定向到用户的注册表虚拟根,但默认权限会拒绝 Windows Vista 进程的访问。
除了文件系统和注册表虚拟化以外,某些应用程序还需要其他帮助才能在标准用户权限下正确运行。例如,对于测试其正在运行的帐户是否是 Administrators 组成员的应用程序,如果是该组成员,则会正常运行,如果不是,则不能正常运行。因此,Windows Vista 定义了许多应用程序兼容性填充,以使这类应用程序无论如何都能够运行。最常应用于旧应用程序以使其在标准权限下操作的填充如图 7 所示。企业 IT 专业人员可以使用诸如应用程序兼容性工具包(ACT,可从 technet.microsoft .com/windowsvista/aa905066.aspx 获得),及其标准用户分析程序 (SUA) 实用工具,或 Aaron Margosis 的 LUA Buglight 等工具来确认其 LOB 应用程序的填充要求。他们使用 Compatibility Administrator(也是 ACT 的一部分)将填充分配给应用程序,然后将得到的兼容性数据库(.sdb 文件)通过组策略部署到桌面。请注意,如果需要,可以对使用全局安全策略设置的系统完全禁用虚拟化。
虚拟化的效果
在“任务管理器”中右键单击某个进程并从上下文菜单中选择“虚拟化”,即可更改进程的虚拟化状态。图 A 显示了当其虚拟化状态更改时命令提示符的行为。开始时虚拟化是禁用的,因为它有一个 Windows Vista 指令清单。因为它使用标准用户权限运行,所以无法在 \Windows 目录中创建文件,但是在使用任务管理器将其虚拟化后,它似乎能够成功创建该文件。当其虚拟化返回禁用状态时,它将找不到该文件,该文件实际位于用户的虚拟存储中。

图 A 虚拟化状态更改
管理员批准模式
即使用户只运行与标准用户权限兼容的程序,某些操作仍要求管理权限。绝大多数软件安装都要求使用管理权限,以便在系统全局位置创建目录或注册表项,或者安装服务或设备驱动程序。修改系统全局 Windows 设置和应用程序设置也要求使用管理权限,Windows Vista 家长控制功能便是如此。通过切换到专用管理帐户可以执行大多数这些操作,但是这样很不方便,导致多数用户仍然会使用管理帐户来执行其日常任务。
因此,Windows Vista 提供了一个增强的“运行身份”功能,以使标准用户能够方便地以管理权限启动进程。此功能要求为应用程序提供一种方式来标识系统可为之获得管理权限(代表该应用程序)的操作,我将对此进行简要说明。
此外,Windows Vista 还引入了一个管理员批准模式 (AAM),这样,作为系统管理员的用户便可以使用标准用户权限来运行,而不必在每次希望获得管理权限时输入用户名和密码。此功能在登录时为用户创建两个身份:一个具有标准用户权限,另一个具有管理权限。由于 Windows Vista 系统上的每个用户要么是标准用户,要么多数情况下作为 AAM 中的标准用户来运行,因而开发人员必须假定所有 Windows 用户都是标准用户,这将导致有更多的程序使用不带有虚拟化或填充的标准用户权限来运行。
为进程授予管理权限称为提升。由标准用户帐户执行此过程时,称为“当面式”(OTS) 提升,因为它要求输入某个管理员组的成员帐户的凭据,这通常由另一个用户当着该标准用户的面完成。由 AAM 用户执行的提升称为“同意”提升,因为用户只需批准其管理权限的分配即可。
如果用户是图 8 中所列任意管理员类型组的成员,Windows Vista 就会将该用户视为管理员。所列的许多组都只用于加入域的系统,并且不直接赋予用户本地管理权限,但是允许他们修改域范围内的设置。如果用户是其中任何组的成员,而不是实际的管理员组的成员,该用户将通过 OTS 提升而不是“同意”提升来获得其管理权限。
当属于所列的某个组的用户登录时,Windows Vista 将创建一个令牌,代表该用户的管理身份的标准用户版本。新令牌解除了分配给该用户的所有特权,只保留了图 9 中所列的那些特权,它们是默认标准用户特权。此外,任何管理员类型组在该新令牌中都带有 USE_FOR_DENY_ONLY 标志。图 10 显示了 Sysinternals Process Explorer(一种进程管理工具,可从 microsoft .com/technet/sysinternals 下载),其左侧显示了使用管理权限运行的进程的组成员关系和特权,右侧显示了不具备管理员权限的情况。(为防止意外错误使用,Windows 安全模型要求先启用带有禁用标志的特权,然后才能使用它。)

图 10 AAM 管理员和标准用户令牌











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面