用户帐户控制

注意

此设计指南是为 Windows 7 创建的,并且尚未更新Windows的较新版本。 大部分指南原则上仍然适用,但演示和示例并不反映我们 当前的设计指南

设计良好的用户帐户控制体验有助于防止不需要的系统范围的更改,这种更改是可预测的,并且需要最少的努力。

使用用户帐户控制 (UAC) 完全启用后,交互式管理员通常以最少的用户权限运行,但可以通过授予同意 UI 的显式同意来自我提升以执行管理任务。 此类管理任务包括安装软件和驱动程序、更改系统范围的设置、查看或更改其他用户帐户以及运行管理工具。

在其最低特权状态下,管理员称为“受保护的管理员”。 在提升状态中,它们称为提升管理员。 相比之下,标准用户无法自行提升,但可以要求管理员使用凭据 UI 提升它们。 内置管理员帐户不需要提升。

screen shot of 'allow program' security message

许可 UI,用于提升受保护的管理员具有管理权限。

screen shot of message asking for password

凭据 UI,用于提升标准用户。

UAC 提供以下优势:

  • 它减少了使用提升的权限运行的程序数,从而帮助防止用户意外更改其系统设置,并帮助防止“恶意软件”获得系统范围的访问。 当提升被拒绝时,恶意软件只能影响当前用户的数据。 如果没有提升,恶意软件将无法进行系统范围的更改或影响其他用户。
  • 对于 托管环境,设计良好的 UAC 体验允许用户在以标准用户身份运行时提高工作效率,从而消除不必要的限制。
  • 它使标准用户能够要求管理员授予他们在当前会话中执行管理任务的权限。
  • 对于家庭环境,它可以更好地控制系统范围的更改,包括安装了哪些软件。

开发 人员: 有关实现信息,请参阅 重新设计 UI 实现 UAC 兼容性

在 Windows Vista 中,受保护的管理员可以选择收到有关所有系统更改或无更改的通知。 UAC 默认设置是通知所有更改,无论其来源是什么。 收到通知后,桌面将变暗,并且必须在 UAC 对话框中批准或拒绝请求,然后才能在计算机上执行任何其他操作。 桌面的变暗称为 安全桌面 ,因为其他程序在变暗时无法运行。

除了 Windows Vista 中的两个中间 UAC 设置外,Windows 7 还引入了两个受保护管理员的中间 UAC 设置。 第一个是仅在程序进行更改时通知用户,因此管理员在自行进行更改时会自动提升。 这是 Windows 7 中的 UAC 默认设置,它还使用安全桌面。

Windows 7 中的第二个中间设置与第一个设置相同,只不过它不使用安全桌面。

screen shot of four uac settings in windows 7

Windows 7 引入了两个中间 UAC 设置。

注意: 与编写 代码以支持用户帐户控制 相关的指南将分别在一篇文章中介绍。

设计概念

目标

设计良好的用户帐户控制体验具有以下目标:

  • 消除不必要的提升。 用户必须提升权限才能执行需要管理权限的任务。 所有其他任务都应设计为消除提升需求。 通常,旧版软件需要管理员权限,方法是写入 HKLM 或 HKCR 注册表部分,或程序文件或Windows系统文件夹。
  • 可预测。 标准用户需要知道哪些任务需要管理员在托管环境中执行或根本无法执行。 管理员需要知道哪些任务需要提升。 如果他们无法准确预测提升需求,则更可能同意管理任务(如果不应)。
  • 需要最少的努力。 需要管理权限的任务应设计为需要单个提升。 需要多个提升的任务会很快变得繁琐。
  • 还原为最小特权。 完成需要管理权限的任务后,程序应还原为最低特权状态。

提升任务流

当任务需要提升时,它具有以下步骤:

  1. 入口点。 完全启用 UAC 时需要立即提升的任务具有使用 UAC 防护标记的入口点。 在这种情况下,用户应在单击此类命令后立即看到提升 UI,当他们看到来自没有盾牌的任务中的提升 UI 时,他们应格外谨慎。

    screen shot of uac shield icons and their labels

    在此示例中,家长控制和用户帐户控制面板项目需要提升。

    当 UAC 部分启用或完全关闭时,仍会显示 UAC 防护以指示任务涉及系统级更改,因此需要提升,即使用户可能看不到提升 UI 也是如此。 始终显示需要提升的任务的 UAC 防护,使 UI 保持简单且可预测的状态。

  2. 海拔。 对于受保护的管理员,任务使用许可 UI 请求同意。 对于标准用户,任务使用凭据 UI 请求管理员凭据。

    screen shot of two types of elevation

    这些示例显示了凭据 UI 和许可 UI。

  3. 单独的提升进程。 在内部,会创建一个新的提升进程来执行该任务。

  4. 还原为最小特权。 如有必要,请还原为最低特权,以完成不需要提升的任何步骤。

请注意,任务不会“记住”提升状态。 例如,如果用户在向导中的提升入口点上来回导航,则用户每次都必须提升。

使用模式

用户帐户控制按首选项顺序 (多个使用模式) :

  1. 适用于标准用户。 通过将该功能的范围限制为当前用户,为所有用户设计该功能。 通过将设置限制为当前用户 (而不是系统范围的) ,可以完全不需要提升 UI,并使用户能够完成任务。

    不正确:

    screen shot of message: you do not have privilege

    在此示例中,Windows XP 用户必须具有查看或更改当前时区的管理权限。

    正确:

    screen shot of date and time dialog box

    在此示例中,时区功能在 Windows 7 中进行了重新设计,Windows Vista 供所有用户使用。

  2. 为标准用户和管理员提供单独的 UI 元素。 明确将标准用户任务与管理任务分开。 为所有用户提供对有用只读信息的访问权限。 使用 UAC 防护明确标识管理任务。

    graphic of uac shield showing elevation required

    在此示例中,系统控制面板项向所有用户显示其状态,但更改系统范围的设置需要提升。

  3. 允许标准用户尝试任务,并在失败时提升。 如果标准用户可以查看信息,并且能够在不提升的情况下进行一些更改,则允许他们访问 UI,并且仅当任务失败时才提升它们。 当标准用户具有有限访问权限(例如,在 Windows Explorer 中具有自己文件的属性)时,此方法适用。 它还适用于控制面板混合中心页上的设置。

    screen shot of access is denied message

    在此示例中,用户尝试更改程序文件属性,但没有足够的权限。 用户可以提升并重试。

  4. 仅适用于管理员。 仅对管理员功能和程序使用此方法! 如果某个功能仅适用于管理员 (,并且没有标准用户) 的导航路径或有用的只读信息,则可以在入口点提示管理员凭据,然后显示任何 UI。 当所有路径都需要管理权限时,请对较长的向导和 页面流 使用此方法。

    如果整个程序仅适用于管理员,请将其标记为提示管理员凭据才能启动。 Windows使用 UAC 防护覆盖显示此类程序图标。

    screen shot of windows logo and uac shield overlay

    在此示例中,程序需要管理权限才能启动。

指南

UAC 防护图标

  • 显示带有 UAC 防护的控件,以指示任务在完全启用 UAC 时需要立即提升, 即使 UAC 当前未完全启用也是如此。 如果向导和 页面流 的所有路径都需要提升,请在任务的入口点显示 UAC 防护。 正确使用 UAC 防护有助于用户预测何时需要提升。

  • 如果程序支持多个版本的Windows,如果至少一个版本需要提升,则显示 UAC 防护。 由于 Windows XP 从不需要提升,因此,如果可以一致且不会损害性能,请考虑删除 Windows XP 的 UAC 防护。

  • 不要为大多数上下文中不需要提升的任务显示 UAC 防护。 由于此方法有时会误导,因此首选方法是改用受正确防护的上下文命令。

    screen shot of photo files in windows explorer

    由于“新建文件夹”命令仅在系统文件夹中使用时才需要提升,因此它不带 UAC 防护。

  • UAC 防护可以显示在以下控件上:

    命令按钮:

    screen shot of command button with uac shield icon

    需要即时提升的命令按钮。

    命令链接:

    screen shot of command link with uac shield icon

    需要即时提升的命令链接。

    链接:

    screen shot of change account link with uac shield

    需要即时提升的链接。

    菜单:

    screen shot of menu with uac shield

    需要即时提升的下拉菜单。

  • 由于任务不记得提升状态, 因此不要更改 UAC 防护以反映状态。

  • 显示 UAC 防护,即使用户帐户控制已关闭,或者用户正在使用内置管理员帐户。 一致地显示 UAC 防护更易于编程,并为用户提供有关任务性质的信息。

Elevation

  • 尽可能设计标准用户在不提升的情况下执行的任务。 向所有用户授予对有用只读信息的访问权限。

  • 根据每个任务提升,而不是基于每个设置提升。 不要将标准用户设置与单页或对话框中的管理设置混合在一起。 例如,如果标准用户可以更改部分但并非所有设置,请将这些设置拆分为单独的 UI 图面。

    不正确:

    screen shot of date and time settings dialog box

    在此示例中,标准用户设置与管理设置错误地混合在一起。

    正确:

    screen shot of same dialog box without uac shields

    在此示例中,更改日期和时间的设置位于单独的对话框中,仅适用于管理员。 时区设置对标准用户可用,与管理设置不混合。

  • 在确定是否应显示或禁用控件时,不要考虑需要提升。 这是因为:

    • 在非托管环境中,假设标准用户可以通过请求管理员提升。 禁用需要提升的控件会阻止用户提升管理员。
    • 在托管环境中,假设标准用户根本无法提升。 删除需要提升的控件会阻止用户知道何时停止查找。
  • 若要消除不必要的提升,需要:

    • 如果任务可能需要提升,请尽可能晚提升。 如果任务需要 确认,则仅在用户确认后显示提升 UI。 如果任务始终需要提升,请在其入口点提升。
    • 提升后,请保持提升状态,直到不再需要提升的权限。 用户不必多次提升才能执行单个任务。
    • 如果用户必须提升权限才能进行更改,但选择不进行任何更改,请保持启用正提交按钮,但将提交作为取消进行处理。 这样做可消除用户只需提升权限即可关闭窗口。
    • 不正确:
    • screen shot of window with only one button active
    • 在此示例中,禁用“保存更改”按钮以避免不必要的提升,但在用户更改选择时会启用。 但是,禁用的提交按钮使它看起来用户真的没有选择。
  • 任务失败时不要显示错误消息,因为用户选择不提升。 假设用户有意选择不继续,因此不会将这种情况视为错误。

    不正确:

    screen shot of message: fabrikam restore can't run

    在此示例中,Fabrikam Restore 在用户决定不提升时错误地给出错误消息。

  • 不要显示警告来说明用户可能需要提升其权限来执行任务。 让用户自行发现此事实。

  • 根据下表显示 UAC 防护和提升 UI:

    Object 情况 放置 UAC 防护的位置 何时提升
    节目
    整个程序仅适用于管理员。
    screen shot of windows logo and uac shield overlay
    程序图标上的 UAC 防护覆盖。
    在启动时显示提升 UI。
    Command
    整个命令仅适用于管理员。
    screen shot of change account link and uac shield
    命令按钮或链接上的 UAC 防护。
    单击命令按钮或链接时显示提升 UI,但在出现任何确认后。
    Command
    命令显示适用于所有用户的有用只读信息,但更改需要管理权限。
    screen shot of change settings link and uac shield
    命令按钮上的 UAC 防护或链接进行更改。
    单击命令按钮时显示提升 UI,但在出现任何确认后。
    Command
    标准用户可以查看信息,并且可以在不提升的情况下进行一些更改。 允许标准用户尝试,并在失败时提升。
    screen shot of error with uac icon on retry button
    不要显示命令的 UAC 防护,但如果命令失败,则为提升入口点显示它。
    当用户重试命令时显示提升 UI。
    任务步骤
    所有后续步骤都需要提升。
    screen shot of next command button with uac shield
    “下一步”按钮上的 UAC 防护 (或等效) 。
    单击“下一步”或其他提交按钮时显示提升 UI。
    任务步骤
    某些分支需要提升。
    screen shot of command link with uac shield
    需要提升的命令链接上的 UAC 防护。
    单击带有 UAC 防护的命令链接时显示提升 UI。

提升 UI

  • 如果用户提供的帐户无效 (名称或密码) 或没有管理员权限,只需重播凭据 UI。 不显示错误消息。
  • 如果用户取消凭据 UI,请返回用户返回到原始 UI。 不显示错误消息。
  • 如果用户帐户控制已关闭,标准用户尝试执行需要提升的任务,请提供一条错误消息,指出“此任务需要管理员权限。 若要执行此任务,必须使用管理员帐户登录。

screen shot of task requires privileges message

在此示例中,用户帐户控制已关闭,因此错误消息说明用户必须使用管理员帐户。

向导

  • 不要多次提升。 提升向导后,应保持提升状态。
  • 如果在向导中执行任务,请在提交页面的“下一步”按钮上放置 UAC 防护 (,该按钮应) 提供更 具体的标签 。 用户提交时:
    • 如果下一页是“进度”页,请前进到该页面,并按模式显示提升 UI。 成功提升后,执行任务。
    • 如果下一页是“完成”页,请转到该页面 (,但暂时将其内容替换为“正在等待权限...”) 并模式显示提升 UI。 成功提升后,执行任务,然后显示“完成”页内容。
    • 如果用户取消提升 UI,则返回到“提交”页。 这样,用户就可以重试。
  • 如果在向导完成后执行任务,请在提交页面的“完成”按钮上放置 UAC 防护 (,该按钮应) 给出更 具体的标签 。 当用户提交时:
    • 保留在“提交”页上,并按模式显示提升 UI。 成功提升后,关闭向导。
    • 如果用户取消提升 UI,则返回到“提交”页。 这样一来,用户就可以重试。
  • 对于仅适用于管理员的冗长向导,可以在入口点提示管理员凭据,然后再显示任何 UI。

文本

  • 不要仅仅因为命令需要提升而使用省略号。 需要使用 UAC 防护来指示提升。

文档

引用用户帐户控制时:

  • 在第一次提及) 或 UAC () (而不是最低特权用户帐户或 LUA)上,请参阅此功能作为用户帐户控制 (。
  • 将非管理员称为标准用户。
  • 以内置管理员身份引用内置计算机管理员。

在用户文档中:

  • 请参阅授予权限时同意执行管理任务的行为。

在编程和其他技术文档中:

  • 请参阅同意以提升身份执行管理任务的行为。
  • 在 UAC 的上下文中,在提升后将管理员称为“受保护的管理员”,并在提升后将管理员称为“受保护的管理员”。
  • 请参阅用于输入密码作为凭据 UI 的对话框。 请参阅用于授予同意作为许可 UI 的对话框。 通常将这两者称为提升 UI。