默认浏览器代理

默认浏览器代理是一个仅限 Windows 的计划任务,它在后台运行,收集并提交有关用户设置为其操作系统默认浏览器的数据(即,操作系统将调用该浏览器以打开用户在其他程序中点击的 Web 链接)。其目的是帮助 Mozilla 了解用户的默认浏览器选择,并在将来在用户可能没有积极运行 Firefox 的时候与他们互动。

有关代理发送的具体数据的信息,请参阅 ping 文档

计划任务

该代理作为 Windows 计划任务 运行。计划任务代理可执行文件调用 Firefox BackgroundTask_defaultagent,后者执行代理的所有主要功能;其所有其他功能都与管理任务相关。Windows 安装程序负责创建(卸载程序负责删除)代理的任务条目,但执行此操作的代码本身位于代理中,安装程序只是使用专用的命令行参数(register-taskuninstall)调用它。 PostUpdate 代码还会调用代理以更新现有任务注册中需要更新的任何属性,或者在应用程序更新期间如果不存在则创建一个。

这些任务是 Windows 任务计划程序中的普通条目,使用 其 Win32 API 进行管理。它们创建在一个名为“Mozilla”(或应用程序供应商名称)的任务文件夹中,每个 Firefox 安装(或其他 Mozilla 应用程序)都有一个。任务设置为每天自动运行一次,从注册时间开始(第一次运行在 24 小时后),或计算机唤醒后的最近时间。任务配置了一个操作,即使用命令行参数 do-task 运行代理二进制文件,该命令调用实际的代理功能。

默认浏览器代理需要以某个操作系统级别的用户身份运行,而不是,例如,LOCAL SERVICE,以便读取用户的默认浏览器设置。因此,默认浏览器代理以运行 Firefox 安装程序的用户身份运行(尽管始终没有提升权限,无论安装程序是否有提升权限)。

远程禁用

默认浏览器代理可以远程禁用和(重新)启用。每次计划任务运行时,它都会查询 Firefox 远程设置 以确定代理是否已被远程禁用或(重新)启用。

如果默认浏览器代理被策略禁用,则不会检查远程禁用。但是,代理的通知功能与代理的遥测功能不同,远程禁用必须适用于这两个功能。因此,即使用户已选择不发送遥测数据(通过策略或首选项),代理也必须检查远程禁用。对于当前已选择不发送遥测数据的用户,他们不会因为默认浏览器代理被远程(重新)启用而选择加入。

数据管理

默认浏览器代理必须能够处理多个不同级别的设置:Firefox 配置文件、操作系统用户、Firefox 安装和整个系统。此需求在所有这些内容之间创建了一个信息架构不匹配,主要是因为在代理运行时没有可用的 Firefox 配置文件;直接使用或克隆 Firefox 的配置文件选择功能实际上是不可行的,即使我们可以选择一个配置文件,我们可能用于实际处理它的任何代码也会遇到相同的问题。因此,为了允许从 Firefox 控制代理,某些设置会从 Firefox 镜像到代理可以读取的位置。由于代理仅在操作系统级别的用户上下文中运行,这意味着在这种情况下,使用多个 Firefox 配置文件的单个操作系统级别的用户可能会观察到代理的设置随着不同的配置文件争先恐后地成为活动镜像而发生变化,而他们并没有主动采取任何措施。

首选项反射

代理需要能够读取(但不能设置)其规范表示形式为 Firefox 首选项的值。这意味着必须将这些首选项值复制到代理可以读取的位置。Windows 注册表被选为该位置;它比文件更容易使用,并且我们已经在其中保留了 Firefox 保留的密钥。具体来说,用于这些首选项的子密钥是 HKEY_CURRENT_USER\Software\[app vendor name]\[app name]\Default Browser Agent\。在 Firefox 启动期间,控制代理的首选项的值会反映到此密钥,并且这些值会在此后的首选项更改时更新。

反映的首选项列表包括全局遥测选择退出首选项 datareporting.healthreport.uploadEnabled 和一个名为 default-browser-agent.enabled 的首选项,它可以启用或禁用整个代理。代理在计划任务运行时检查这些注册表反射的首选项值,它们实际上不会阻止计划任务运行。

企业策略也存在于执行与这些首选项相同的功能。它们的工作方式与所有其他 Firefox 策略相同,并且 这些策略的文档 说明了如何使用它们。

此外,以下 Firefox 远程设置首选项会反映:services.settings.server。它是咨询远程禁用的服务端点。

默认浏览器设置

代理负责报告用户的当前默认浏览器和他们以前使用的默认浏览器。操作系统中没有任何内容记录过去的关联,因此代理必须自行执行此操作。首先,它通过调用 IApplicationAssociationRegistration::QueryCurrentDefault 获取当前默认浏览器用于 http 协议。然后,它将其与存储在其自身注册表密钥中的值进行比较,如果它们不同,它就知道默认浏览器已更改,并记录新的和旧的默认值。