下图详细介绍了 UAC 体系结构。
用户
- 用户执行需要特权的作:如果作更改了文件系统或注册表,则会调用虚拟化。 所有其他作调用 ShellExecute。
-
ShellExecute:ShellExecute 调用 CreateProcess。 ShellExecute 在 CreateProcess 中查找
ERROR_ELEVATION_REQUIRED
错误。 如果收到错误,ShellExecute 会调用应用程序信息服务,以尝试使用提升的提示执行请求的任务。 -
CreateProcess:如果应用程序需要提升,CreateProcess 会拒绝使用
ERROR_ELEVATION_REQUIRED
的调用。
系统
应用程序信息服务:
- 一种系统服务,可帮助启动需要一个或多个提升的权限或用户权限才能运行的应用。
- 应用程序信息服务通过在需要提升时使用管理用户的完全访问令牌为应用程序创建一个新进程来帮助启动此类应用。
- 根据配置的策略,用户可能会同意。
提升 ActiveX 安装:
- 如果未安装 ActiveX,系统会检查 UAC 滑块级别。
- 如果安装了 ActiveX,则会选中“用户帐户控制:在提示提升组策略时切换到安全桌面”设置。
检查 UAC 滑块级别:UAC 有一个滑块,可从四个通知级别中进行选择:
-
始终通知 将:
- 当程序尝试安装软件或对计算机进行更改时,通知你。
- 更改 Windows 设置时通知你。
- 冻结其他任务,直到你做出响应。
- 如果你经常安装新软件或访问不熟悉的网站,建议这样做。
-
仅当程序尝试对我的计算机进行更改时,才会通知我 :
- 当程序尝试安装软件或对计算机进行更改时,通知你。
- 对 Windows 设置进行更改时,不会通知你。
- 冻结其他任务,直到你做出响应。
- 如果你不经常安装应用或访问不熟悉的网站,建议这样做。
-
仅当程序尝试对我的计算机进行更改时通知我 (不调暗我的桌面) 会:
- 当程序尝试安装软件或对计算机进行更改时,通知你。
- 对 Windows 设置进行更改时,不会通知你。
- 在响应之前,不会冻结其他任务。
- 不建议这样做。 仅当需要很长时间来调暗计算机上的桌面时,才选择此选项。
-
从不通知 (禁用 UAC 提示) 将:
- 当程序尝试安装软件或更改计算机时,不会通知你。
- 对 Windows 设置进行更改时,不会通知你。
- 在响应之前,不会冻结其他任务。
- 出于安全考虑,不建议这样做。
-
始终通知 将:
已启用安全桌面:选中 “用户帐户控制:在提示提升策略设置时切换到安全桌面 ” :
- 如果启用了安全桌面,则无论管理员和标准用户的提示行为策略设置如何,所有提升请求都会转到安全桌面。
- 如果未启用安全桌面,则所有提升请求将发送到交互式用户的桌面,并使用管理员和标准用户的每个用户设置。
CreateProcess:
- CreateProcess 调用 AppCompat、Fusion 和 Installer 检测来评估应用是否需要提升。
- 然后检查该文件以确定其请求的执行级别,该级别存储在文件的应用程序清单中。
- 如果清单中指定的请求执行级别与访问令牌不匹配,并且向 ShellExecute 返回错误 (ERROR_ELEVATION_REQUIRED) ,CreateProcess 将失败。
AppCompat:
- AppCompat 数据库将信息存储在应用程序的应用程序兼容性修补程序条目中。
Fusion:
- Fusion 数据库存储来自描述应用程序的应用程序清单的信息。
- 更新清单架构以添加新请求的执行级别字段。
安装程序检测:
- 安装程序检测可检测安装程序文件,并帮助防止在用户不知情和未经同意的情况下运行安装。
内核
- 虚拟化:虚拟化技术可确保不合规的应用不会以无法确定原因的方式无提示地运行或失败。 UAC 还为写入到受保护区域的应用程序提供文件和注册表虚拟化以及日志记录。
- 文件系统和注册表:每用户文件和注册表虚拟化将每台计算机注册表和文件写入请求重定向到等效的每用户位置。 读取请求首先重定向到虚拟化的每用户位置,然后重定向到每台计算机位置。
滑块永远不会完全关闭 UAC。 如果将其设置为 “从不通知”,它将:
- 使 UAC 服务保持运行
- 导致管理员发起的所有提升请求在未显示 UAC 提示的情况下自动批准
- 自动拒绝标准用户的所有提升请求
重要提示
若要完全禁用 UAC,必须禁用“用户帐户控制:在管理员审批模式下运行所有管理员”策略。 禁用 UAC 时,某些通用 Windows 平台应用可能无法正常工作。
虚拟化
由于企业环境中的系统管理员尝试保护系统,因此许多业务线 (LOB) 应用程序设计为仅使用标准用户访问令牌。 因此,打开 UAC 后,无需替换大多数应用。
Windows 包含适用于不符合 UAC 且需要管理员访问令牌才能正常运行的应用的文件和注册表虚拟化技术。 当不符合 UAC 标准的管理应用尝试写入受保护的文件夹(如 Program Files)时,UAC 会为应用提供它尝试更改的资源的虚拟化视图。 虚拟化副本在用户的配置文件中维护。 此策略为运行不合规应用的每个用户创建虚拟化文件的单独副本。
大多数应用任务通过使用虚拟化功能可以正常运行。 尽管虚拟化允许大多数应用程序运行,但它是短期修复,而不是长期解决方案。 应用开发人员应尽快修改其应用,使其符合要求,而不是依赖文件、文件夹和注册表虚拟化。
在以下方案中,虚拟化不是一个选项:
- 虚拟化不适用于提升并使用完全管理访问令牌运行的应用
- 虚拟化仅支持 32 位应用。 未授权的 64 位应用在尝试获取句柄 (Windows 对象的唯一标识符) 时会收到拒绝访问消息。 本机 Windows 64 位应用需要与 UAC 兼容,并将数据写入到正确的位置
- 如果应用包含具有请求的执行级别属性的应用清单,则禁用虚拟化
请求执行级别
应用清单是一个 XML 文件,用于描述和标识应用在运行时应绑定到的共享程序集和专用并行程序集。 应用清单包含用于 UAC 应用兼容性的条目。 在应用清单中包含条目的管理应用会提示用户提供访问用户访问令牌的权限。 尽管它们缺少应用清单中的条目,但大多数管理应用都可以使用应用兼容性修补程序在不进行修改的情况下运行。 应用兼容性修补程序是数据库条目,使不符合 UAC 的应用程序能够正常工作。
所有符合 UAC 的应用都应将请求的执行级别添加到应用程序清单。 如果应用程序需要对系统进行管理访问权限,请将请求的执行级别标记为 “需要管理员 ”的应用可确保系统将此程序标识为管理应用,并执行必要的提升步骤。 请求的执行级别指定应用所需的权限。
安装程序检测技术
安装程序是设计用于部署软件的应用。 大多数安装程序写入系统目录和注册表项。 这些受保护的系统位置通常只能由安装程序检测技术的管理员写入,这意味着标准用户没有足够的访问权限来安装程序。 Windows 会启发式检测安装程序,并请求管理员凭据或管理员用户的批准,以便使用访问权限运行。 Windows 还会启发式检测卸载应用程序的更新和程序。 UAC 的设计目标之一是防止在用户不知情和同意的情况下运行安装,因为安装程序会写入文件系统和注册表的受保护区域。
安装程序检测仅适用于:
- 32 位可执行文件
- 没有请求的执行级别属性的应用程序
- 以启用了 UAC 的标准用户身份运行的交互式进程
在创建 32 位进程之前,会检查以下属性以确定它是否为安装程序:
- 文件名包括“install”、“setup”或“update”等关键字。
- 版本控制资源字段包含以下关键字:供应商、公司名称、产品名称、文件说明、原始文件名、内部名称和导出名称。
- 并行清单中的关键字嵌入到可执行文件中。
- 特定 StringTable 条目中的关键字在可执行文件中链接。
- 资源脚本数据中的键属性链接在可执行文件中。
- 可执行文件包含目标字节序列。
注意
关键字和字节序列派生自各种安装程序技术观察到的常见特征。
注意
必须启用 “用户帐户控制:检测应用程序安装并提示提升 ”策略,才能检测安装程序。 有关详细信息,请参阅 用户帐户控制设置列表。