存档:Windows 桌面应用 v1.2 的认证要求

文档版本: 1.2

文档日期:2012 年 5 月 31 日

本文档包含桌面应用为了参与 Windows 8 桌面应用认证计划而必须满足的技术要求和资格资格。 对于 Windows 7,此程序称为 Windows 软件徽标计划。

欢迎!

Windows 平台支持广泛的产品和合作伙伴生态系统。 在产品上显示 Windows 徽标表示Microsoft与公司之间对质量的共享承诺。 客户信任你的产品上的 Windows 品牌,因为它确保它符合兼容性标准并在 Windows 平台上表现良好。 成功通过 Windows 应用认证后,你的应用可在 Windows 兼容性中心展示,这也是在 Windows 应用商店中列出桌面应用引用的必要步骤。

Windows 应用认证计划由计划和技术要求组成,可帮助确保携带 Windows 品牌的第三方应用在运行 Windows 的电脑上易于安装和可靠。 客户在购买的系统中重视稳定性、兼容性、可靠性、性能和质量。 Microsoft专注于其投资,以满足在适用于电脑的 Windows 平台上运行的软件应用的要求。 这些工作包括兼容性测试,以确保体验的一致性、改进的性能,以及运行 Windows 软件的电脑上增强的安全性。 Microsoft兼容性测试是与行业合作伙伴合作设计的,并不断改进,以应对行业发展和消费者需求。

Windows 应用认证工具包用于验证符合这些要求,并替换用于在 Windows 7 软件徽标计划中验证的 WSLK。 Windows 应用认证工具包是 Windows 软件开发工具包(SDK)中包含的组件之一。

应用资格

对于符合 Windows 8 桌面应用认证资格的应用,它必须满足以下条件以及本文档中列出的所有技术要求。

  • 它必须是独立应用
  • 它必须在本地 Windows 8.1 计算机上运行
  • 它可以是经过认证的 Windows Server 应用的客户端组件
  • 它必须是代码和功能完成

1.应用兼容且具有复原能力

应用崩溃或停止响应的时间会导致用户感到非常沮丧。 应用应具有复原能力和稳定性,消除此类故障有助于确保软件更具可预测性、可维护性、高性能且可信性。

1.1 你的应用不得依赖于 Windows 兼容性模式、AppHelp 消息或任何其他兼容性修补程序
1.2 应用不得依赖于 VB6 运行时
1.3 你的应用不得加载任意 DLL 来截获使用 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows AppInit_dlls的 Win32 API 调用。

2.应用必须遵循 Windows 安全最佳做法

使用 Windows 安全最佳做法有助于避免暴露在 Windows 攻击面上。 攻击面是恶意攻击者利用目标软件中的漏洞来利用作系统的入口点。 最差的安全漏洞之一是特权提升。

2.1 你的应用必须使用强且适当的 ACL 来保护可执行文件 2.2 你的应用必须使用强且适当的 ACL 来保护目录 2.3 你的应用必须使用强且适当的 保护注册表项的 ACL 2.4 应用必须使用强且适当的 ACL 来保护包含对象 2.5 的目录的安全,应用必须减少对易受篡改的服务的非管理员访问2.6 你的应用必须阻止快速重启的服务每 24 小时重启两次以上
**注意:只能向需要访问的实体授予访问权限。**

Windows 应用认证计划将通过验证 ACL 和服务是否以不危及 Windows 系统的方式验证 Windows 攻击图面是否未公开。

3. 应用支持 Windows 安全功能

Windows作系统具有许多支持系统安全和隐私的功能。 应用必须支持这些功能才能维护作系统的完整性。 编译不当的应用可能会导致缓冲区溢出,进而会导致拒绝服务或允许恶意代码执行。

3.1 你的应用不得使用 AllowPartiallyTrustedCallersAttribute (APTCA)来确保对强命名程序集的安全访问
3.2 必须使用 /SafeSEH 标志编译你的应用,以确保安全异常处理
3.3 必须使用 /NXCOMPAT 标志编译应用以防止数据执行
3.4 必须使用 /DYNAMICBASE 标志对地址空间布局随机化(ASLR)进行编译
3.5 你的应用不得读取/写入共享 PE 部分

4.应用必须遵循系统重启管理器消息

当用户启动关闭时,他们通常强烈希望看到关闭成功;他们可能急于离开办公室,只是希望他们的电脑关闭。 应用必须遵循这种需求,而不是阻止关闭。 尽管在大多数情况下,关闭可能并不重要,但必须准备好应用,才能进行严重关闭。

4.1 你的应用必须适当地处理关键关闭
在关键关机中,返回 FALSE 到WM_QUERYENDSESSION的应用将WM_ENDSESSION和关闭,而响应WM_QUERYENDSESSION超时的应用将终止。

4.2 GUI 应用必须立即返回 TRUE,才能准备重启
使用 LPARAM 的 WM\_QUERYENDSESSION = ENDSESSION\_CLOSEAPP(0x1)。 控制台应用可以调用 SetConsoleCtrlHandler 来指定将处理关闭通知的函数。 服务应用可以调用 RegisterServiceCtrlHandlerEx 来指定将接收关闭通知的函数。
4.3 应用必须在 30 秒内返回 0 并关闭
使用 LPARAM 的 WM\_ENDSESSION = ENDSESSION\_CLOSEAPP(0x1)。 应用应至少通过保存任何用户数据来准备,并声明重启后所需的信息。
4.4 接收 CTRL\_C\_EVENT 通知的控制台应用应立即关闭 4.5 驱动程序不得否决系统关闭事件
**注意:由于无法中断的作而必须阻止关闭的应用应解释用户的原因。** 使用 ShutdownBlockReasonCreate 注册一个解释用户原因的字符串。 作完成后,应用应调用 ShutdownBlockReasonDestroy 以指示系统可以关闭。

5.应用必须支持干净、可逆的安装

干净、可逆的安装允许用户在其系统上成功管理(部署和删除)应用。

5.1 你的应用必须正确实现干净、可逆的安装
如果安装失败,应用应能够回滚该应用,并将计算机还原到其以前的状态。

5.2 你的应用绝不能强制用户立即重启计算机
重启计算机不应是安装或更新结束时的唯一选项。 用户应有机会稍后重启。
5.3 你的应用绝不必须依赖于 8.3 短文件名 (SFN) 5.4 你的应用决不能阻止无提示安装/卸载 5.5 你的应用安装程序必须创建正确的注册表项才能成功检测和卸载
Windows 清单工具和遥测工具需要有关已安装应用的完整信息。 如果使用基于 MSI 的安装程序,MSI 会自动创建下面的注册表项。 如果不使用 MSI 安装程序,安装模块必须在安装过程中创建以下注册表项:
  • DisplayName
  • InstallLocation
  • 发行人
  • UninstallString
  • VersionMajor 或 MajorVersion
  • VersionMinor 或 MinorVersion

6. 应用必须对文件和驱动程序进行数字签名

验证码数字签名允许用户确保软件是正版的。 它还允许人们检测文件是否已被篡改,例如它是否被病毒感染。 内核模式代码签名强制实施是一项称为代码完整性(CI)的 Windows 功能,每次将文件映像加载到内存中时验证文件的完整性,从而提高作系统的安全性。 CI 检测恶意代码是否已修改系统二进制文件。 当内核模块的签名无法正确验证时,还会生成诊断和系统审核日志事件。

6.1 所有可执行文件(.exe、.dll、.ocx、.sys、.cpl、.drv、.scr)都必须使用 Authenticode 证书进行签名
6.2 应用安装的所有内核模式驱动程序都必须通过 Windows 硬件认证计划获取Microsoft签名。 所有文件系统筛选器驱动程序都必须由Microsoft签名。
6.3 例外和豁免
豁免将只考虑未签署的第三方可再发行组件,不包括驱动程序。 请求可再发行组件(s)签名版本的通信证明需要授予此豁免。

7. 应用不会基于作系统版本检查阻止安装或应用启动

当没有技术限制时,客户不会被人为地阻止安装或运行其应用非常重要。 一般情况下,如果应用是针对 Windows Vista 或更高版本编写的,则它们不必检查作系统版本。

7.1 你的应用不得对相等性执行版本检查
如果需要特定功能,请检查该功能本身是否可用。 如果需要 Windows XP,请检查 Windows XP 或更高版本(>= 5.1)。 这样,检测代码将继续处理将来版本的 Windows。 驱动程序安装程序和卸载模块不应检查作系统版本。

对于满足以下条件的应用,将考虑 7.2 例外和豁免:
  • 作为一个包提供的应用也运行在 Windows XP、Windows Vista 和 Windows 7 上,需要检查作系统版本以确定在给定作系统上安装哪些组件。
  • 仅使用批准的 API 调用检查作系统的最低版本(仅在安装期间,而不是在运行时)的应用,并正确列出应用清单中的最低版本要求。
  • 安全应用(防病毒、防火墙等)、系统实用工具(例如碎片整理、备份和诊断工具),仅使用批准的 API 调用来检查作系统版本。

8. 应用不会以安全模式加载服务或驱动程序

安全模式允许用户诊断和排查 Windows 问题。 除非基本系统作(如存储设备驱动程序或诊断和恢复目的(如防病毒扫描程序)需要驱动程序和服务才能在安全模式下加载驱动程序和服务。 默认情况下,当 Windows 处于安全模式时,它仅启动预安装 Windows 的驱动程序和服务。

  • 8.1 例外和豁免
    必须在安全模式下启动的驱动程序和服务需要豁免。 豁免请求必须包括写入 SafeBoot 注册表项的每个适用的驱动程序或服务,并描述应用或服务必须以安全模式运行的技术原因。 应用安装程序必须使用以下注册表项注册所有此类驱动程序和服务:
    - HKLM/System/CurrentControlSet/Control/SafeBoot/Minimal - HKLM/System/CurrentControlSet/Control/SafeBoot/Network

注意: 必须测试这些驱动程序和服务,以确保它们以安全模式运行,且没有任何错误。

9. 应用必须遵循用户帐户控制准则

某些 Windows 应用在管理员帐户的安全上下文中运行,应用通常请求过多的用户权限和 Windows 权限。 通过控制对资源的访问,用户可以控制其系统,并防止其发生不需要的更改。 不需要的更改可能是恶意的,例如控制计算机的 rootkit,或者是由拥有有限权限的人员执行的作的结果。 控制对资源的访问的最重要规则是提供用户执行其必要任务所需的最低访问标准用户上下文。 遵循用户帐户控制(UAC)准则为应用提供所需的权限,而不会使系统不断面临安全风险。 大多数应用在运行时不需要管理员权限,并且应该以标准用户身份正常运行。

9.1 你的应用必须具有定义执行级别的清单,并告知作系统应用运行所需的特权
标记的应用清单仅适用于 EXE,不适用于 DLL。 这是因为 UAC 不会在创建过程中检查 DLL。 值得注意的是,UAC 规则不适用于 Windows 服务。 清单可以嵌入或外部。
若要创建清单,请使用名称 <app_name>.exe.manifest 创建一个文件,并将其存储在 EXE 所在的同一目录中。 请注意,如果应用具有内部清单,则忽略任何外部清单。 例如:
<requestedExecutionLevel level=“”asInvoker |highestAvailable |requireAdministrator“” uiAccess=“”true|false“”/>

9.2 应用的主进程必须作为标准用户(asInvoker)运行。
任何管理功能都必须移动到使用管理权限运行的单独进程中。 面向用户的应用(如可通过“开始”菜单上的程序组访问的应用),并且要求提升必须经过验证码签名。
9.3 例外和豁免
对于使用提升的权限运行其主进程的应用(requireAdministrator 或 highestAvailable)需要豁免。 主进程标识为应用的用户入口点。 对于以下情况,将考虑豁免:
  • 执行级别设置为 highestAvailable 和/或 requireAdministrator 的管理或系统工具
  • 只有辅助功能或 UI 自动化框架应用将 uiAccess 标志设置为 true,以绕过用户界面特权隔离(UIPI)。 若要正确启动应用利用率,此标志必须经过验证码签名,并且必须驻留在文件系统中的受保护位置(即 Program Files)。

10.默认情况下,应用必须安装到正确的文件夹

用户应具有与文件的默认安装位置保持一致且安全的体验,同时保留在所选位置安装应用的选项。 还需要将应用数据存储在正确的位置,以便多人使用同一台计算机,而不会损坏或覆盖彼此的数据和设置。 Windows 在文件系统中提供特定位置来存储程序和软件组件、共享的应用数据和特定于用户的应用数据

10.1 默认情况下,你的应用必须安装在 Program Files 文件夹中
对于 %ProgramFiles%中的本机 32 位和 64 位应用,对于在 x64 上运行的 32 位应用,%ProgramFiles(x86)%。 由于为此文件夹配置的安全权限,用户数据或应用数据不得存储在此位置。

10.2 你的应用必须避免在启动时自动启动
例如,应用不应设置以下任何内容:
  • 注册表运行密钥 HKLM,或在 Software\Microsoft\Windows\CurrentVersion 下运行 HKCU
  • 注册表项 HKLM,或在 Software\Wow6432Node\Microsoft\windows\CurrentVersion 下运行 HKCU
  • 启动菜单 AllPrograms > STARTUP
10.3 你的应用数据(必须在计算机上的用户之间共享)应存储在 ProgramData 10.4 你的应用数据中,该数据是特定用户独占的,并且不能与计算机的其他用户共享,必须存储在 Users\\<用户名>\\AppData 10.5 你的应用绝不必须直接写入“Windows”目录和或子目录
使用正确的方法来安装文件,例如字体或驱动程序。
10.6 你的应用必须在首次运行时写入用户数据,而不是在每台计算机安装过程中进行安装
安装应用后,没有用于存储数据的正确用户位置。 安装后,应用尝试修改计算机级别的默认关联行为将失败。 相反,必须在每个用户级别声明默认值,从而阻止多个用户覆盖对方的默认值。
10.7 例外和豁免
写入全局程序集缓存 (GAC) .NET 应用的应用需要豁免,除非明确需要共享程序集,否则应将程序集依赖项保密,并将其存储在应用目录中。

11. 应用必须支持多用户会话

Windows 用户应能够运行并发会话,而不会发生冲突或中断。

11.1 应用必须确保在本地或远程运行多个会话时,应用的正常功能不会受到不利影响
11.2 应用设置和数据文件不能跨用户保留
11.3 用户隐私和首选项必须与用户会话隔离
11.4 应用实例必须彼此隔离
这意味着,来自一个实例的用户数据对应用的另一个实例不可见。 活动用户会话中不应听到非活动用户会话中的声音。 如果多个应用实例使用共享资源,应用必须确保不存在冲突。

为多个用户安装的 11.5 应用必须将数据存储在正确的文件夹和注册表位置
请参阅 UAC 要求。
11.6 用户应用必须能够在本地和远程访问的多个用户会话(快速用户切换)中运行 11.7 你的应用必须检查其他终端服务 (TS) 会话以获取应用的现有实例
**注意:** 如果应用不支持多个用户会话或远程访问,则必须在从此类会话启动时明确声明此状态。

12. 应用必须支持 x64 版本的 Windows

随着 64 位硬件变得更加常见,用户期望应用开发人员通过将应用迁移到 64 位版本来利用 64 位体系结构的优势,或者 32 位版本的应用在 64 位版本的 Windows 下运行良好。

12.1 你的应用必须本机支持 64 位,或者至少 32 位基于 Windows 的应用必须在 64 位系统上无缝运行,以保持与 64 位版本的 Windows 的兼容性
12.2 你的应用及其安装程序不得包含任何 16 位代码或依赖于任何 16 位组件
12.3 应用设置必须检测并安装适合 64 位体系结构的驱动程序和组件
12.4 任何 shell 插件必须在 64 位版本的 Windows 上运行
12.5 在 WoW64 模拟器下运行的应用不应尝试颠覆或绕过 Wow64 虚拟化机制
如果在某些情况下,应用需要检测它们是否在 WoW64 模拟器下运行,则应通过调用 IsWow64Process 来执行此作。

在桌面应用上执行的测试摘要

测试名称 可能的测试结果
遵循系统重启管理器消息 传递/失败
清理可逆安装 传递/失败/警告
兼容性 & 复原测试 传递/失败/警告
数字签名的文件测试 传递/失败/警告
安装到正确的文件夹测试 警告
多用户会话测试 警告
OS 版本检查测试 传递/失败
安全模式测试 传递/失败
支持 x64 Windows 测试 传递/失败
测试对 Windows 安全功能的更改(攻击 Surface 分析器) 传递/失败/警告
测试对 Windows 安全功能的更改(BinScope Binary Analyzer) 警告
用户帐户控制 (UAC) 测试 传递/失败/警告

结论

随着这些要求的发展,我们将记下修订历史记录中的更改。 稳定要求对于完成最佳工作至关重要,因此我们将致力于确保我们所做的更改是可持续的,并继续保护和增强你的应用。

再次感谢我们致力于提供出色的客户体验。

修订历史记录

日期 版本 修订说明 指向文档的链接
2011 年 12 月 20 日 1.0 预览版文档的初始草稿。
2012 年 1 月 26 日 1.1 更新到第 #2 部分。 1.1
2012 年 5 月 31 日 1.2 添加了摘要测试结果
最终文档
1.2

详细了解桌面应用认证

要求 描述 更多详细信息
兼容性和复原能力 崩溃 & 挂起对用户造成重大干扰并造成挫折。 应用应具有复原能力和稳定性,消除此类故障有助于确保软件更具可预测性、可维护性、高性能且可信性。 Windows Vista、Windows 7 和 Windows 8作系统
应用程序验证程序
AppInit DLL
遵循 Windows 安全最佳做法 使用 Windows 安全最佳做法有助于避免暴露在 Windows 攻击面上。 攻击面是恶意攻击者利用目标软件中的漏洞来利用作系统的入口点。 最差的安全漏洞之一是特权提升。 攻击 Surface Analyzer
访问控制列表
支持 Windows 安全功能 Windows作系统实施了许多支持系统安全和隐私的措施。 应用程序必须支持这些措施才能保持 OS 的完整性。 编译不当的应用程序可能会导致缓冲区溢出,进而可能导致拒绝服务或执行恶意代码。 BinScope 工具参考
遵循系统重启管理器消息 当用户启动关闭时,在绝大多数情况下,他们强烈希望看到关闭成功;他们可能急于离开办公室,并“只是想”他们的电脑关闭。 应用必须遵循这种需求,而不是阻止关闭。 尽管在大多数情况下,关闭可能并不重要,但必须准备好应用,才能进行严重关闭。 在 Windows Vista 应用程序关闭更改
重启管理器开发
清理可逆安装 干净、可逆的安装允许用户在其系统上成功管理(部署和删除)应用。 如何:使用 ClickOnce 应用程序安装必备组件
64 位系统上的应用程序安装
对文件和驱动程序进行数字签名 验证码数字签名允许用户确保软件是正版的。 它还允许人们检测文件是否已被篡改,例如,如果文件已被病毒感染。 内核模式代码签名强制实施是一项称为代码完整性(CI)的 Windows 功能,每次将文件映像加载到内存中时验证文件的完整性,从而提高作系统的安全性。 CI 检测恶意代码是否已修改系统二进制文件。 当内核模块的签名无法正确验证时,还会生成诊断和系统审核日志事件。 Windows 上内核模块的 数字签名
不要基于作系统版本检查阻止安装或应用启动 当没有技术限制时,客户不会被人为地阻止安装或运行其应用非常重要。 通常,如果应用是针对 Windows Vista 或更高版本编写的,则它们不应有理由检查作系统版本。 作系统版本控制
不要在安全模式下加载服务和驱动程序 安全模式允许用户诊断和排查 Windows 问题。 除非系统的基本作(例如存储设备驱动程序)或出于诊断和恢复目的(例如防病毒扫描程序)需要,否则驱动程序和服务不得设置为以安全模式加载。 默认情况下,安全模式不会启动大多数未预安装 Windows 的驱动程序和服务。 除非系统要求它们执行基本作或出于诊断和恢复目的,否则它们应保持禁用状态。 确定作系统是否在安全模式下运行
遵循用户帐户控制(UAC)准则 某些 Windows 应用在管理员帐户的安全上下文中运行,许多应用需要过多的用户权限和 Windows 权限。 通过控制对资源的访问,用户可以控制其系统免受不需要的更改(不需要的更改可能是恶意的,例如 rootkit 偷偷接管计算机,或者从拥有有限权限的人员执行的作,例如,员工在工作计算机上安装禁止的软件)。 控制对资源的访问的最重要规则是提供用户执行其必要任务所需的最低访问标准用户上下文。 遵循 UAC 指南可根据需要为应用提供必要的权限,而不会使系统不断面临安全风险。 用户帐户控制
UAC:应用程序更新指南
默认情况下安装到正确的文件夹 用户应具有与文件的默认安装位置一致的安全体验,同时保留将应用安装到他们选择的位置的选项。 还需要将应用数据存储在正确的位置,以便多人使用同一台计算机,而不会损坏或覆盖彼此的数据和设置。 安装/卸载要求 摘要
支持多用户会话 Windows 用户应能够运行并发会话,而不会发生冲突或中断。 远程桌面服务编程指南
支持 x64 版本的 Windows 随着 64 位硬件变得更加普遍,用户期望应用开发人员通过将应用迁移到 64 位版本来利用 64 位体系结构的优势,或者 32 位版本的应用在 64 位版本的 Windows 下运行良好。 应用程序兼容性:Windows Vista 64 位

另请参阅