Windows 受限访问功能

概述

受限访问功能 (LAF) 是需要特殊令牌和证明才能解锁的功能,在调用其相应的 API 之前需要解锁。这些通常采用 com.microsoft.windows.featureFamily.name 的形式。在将 Firefox 固定到 Windows 任务栏的上下文中,这与 Firefox 最相关,因为新的 Windows 固定 API 要求 Firefox 首先解锁相应的 com.microsoft.windows.taskbar.pin LAF。

如果我们需要使用新的受限访问功能,则应在功能文档中请求时通知 Microsoft。

解锁过程

存在于打包上下文中(例如 MSIX 安装)的应用程序具有称为包系列名称 (PFN) 的内容。PFN 在 MSIX 安装的构建时生成,并且在通道之间有所不同。这可以通过 MSIX 上的 Windows API 调用来访问。对于非 MSIX 安装,Microsoft 为我们提供了一个特定的 PFN,该 PFN 位于最终安装中的 rc 文件中,并且可以在 create_rc.py 中修改。

对应于 LAF 的注册表项可以在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\LimitedAccessFeatures\<lafId> 中读取。此键的默认值包含一个字符串,该字符串是“受限访问功能”的“键”。

要获取完整的解锁令牌,可以将 LAF 标识符、LAF 键和 PFN 以 "<lafId>!<lafKey>!<PFN>" 的格式组合,然后进行 SHA256 编码。获取此输出的前 16 个字符并转换为 Base64 即可生成最终令牌。整个过程如下所示

Base64(SHA256Encode("<lafId>!<lafKey>!<PFN>")[0..16])

解锁的另一个部分是证明。我们首先需要发布者标识符,它由 PFN 的最后 13 个字符组成。有了它,就可以使用以下样板代码组装证明

<PFN[-13]> has registered their use of <lafId>
with Microsoft and agrees to the terms of use.

然后,可以将令牌和证明传递给 LimitedAccessFeature.TryUnlockFeature() 以解锁相应的 API 以供使用。