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

文档版本: 1.2

文档日期: 2012 年 5 月 31 日

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

欢迎使用!

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

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

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

应用资格

若要使应用有资格获得Windows 8桌面应用认证,它必须满足以下条件和本文档中列出的所有技术要求。

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

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应用认证计划将验证Windows攻击面是否未公开,方法是验证 ACL 和服务是否以不危及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 例外和豁免
豁免将只考虑未签署的第三方可再发行组件,不包括驱动程序。 请求可再发行组件 () 签名版本的通信证明需要授予此豁免。

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

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

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 例外和豁免
对于使用提升的权限运行主进程的应用,需要豁免, (需要Administrator 或 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 >启动
10.3 你的应用数据(必须在计算机上的用户之间共享)应存储在 ProgramData 10.4 你的应用数据中,该数据是特定用户独占的,并且不能与计算机的其他用户共享,必须存储在 Users\\<username>\\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 位或 32 位版本的应用在 64 位版本的Windows下运行良好,从而利用 64 位体系结构的优势。

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 测试 传递/失败
测试 (攻击 Surface 分析器) 对Windows安全功能的更改 传递/失败/警告
(BinScope Binary Analyzer) 测试对Windows安全功能的更改 警告
用户帐户控制 (UAC) 测试 传递/失败/警告

结论

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

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

修订历史记录

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

另请参阅