Windows 浏览器默认设置:微软到底卡了哪些脖子?

2026-06-05 29 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:12 分钟

浏览器选择联盟(Browser Choice Alliance)最近给微软写了一封公开信,标题只有四个字:《微软,够了》。信中列举了微软在 Windows 中压制竞争对手浏览器的种种手段——从系统级弹窗拦截、Edge 强制捆绑,到经济层面的 OEM 合约限制。这不是抽象的垄断指控,而是每一个 Windows 用户每天都在经历的"微操":你明明装了 Chrome 或 Firefox,系统却反复把你推回 Edge。

问题不在于 Edge 本身好不好,而在于微软利用操作系统的主导地位,在用户选择的最后一公里反复设置路障。下面拆解几个关键的技术与商业机制,并给出一个可以直接运行的脚本,帮你真正看清 Windows 注册表里浏览器默认设置的"暗门"。

微软的三层锁定策略

第一层:系统 UI 层面的"软阻拦"

Windows 10 以后,修改默认浏览器的流程被刻意复杂化。你不再像 Windows 7 邑样一键切换,而是需要逐个文件类型(.html、.htm、http、https)分别确认。每改一个类型,系统都会弹出一个"Edge 更好用"的提示窗口,用户必须额外点击一次才能坚持自己的选择。这不是 bug,是设计。

更隐蔽的是:每次 Windows 大版本更新后,默认浏览器会被静默重置为 Edge。用户不会收到明确通知,只是某天打开链接时发现又回到了 Edge。这种"更新即重置"的策略,本质上是在用系统维护的合法性来覆盖用户的明确偏好。

第二层:注册表与 API 层面的"硬锁定"

Windows 的默认应用关联存储在注册表的多个键中,但微软在近几个版本中引入了 Hash 校验机制——每个用户自定义的关联项必须附带一个由系统计算的哈希值,否则会被视为"非法修改"并自动回退。这意味着第三方浏览器无法通过标准 API 一次性可靠地设置自己为默认浏览器,必须逐个协议调用 ShellExecute 让系统弹窗确认。

公开信中特别提到了这一点:微软在 2023 年宣布开放"设置默认浏览器 API",但实际实现中,这个 API 只能让应用打开系统设置页面,并不能真正完成切换。用户仍然需要手动逐项点击确认。

第三层:OEM 与渠道层面的经济强制

公开信指出,微软与 OEM 厂商的 Windows 许可协议中包含条款,要求预装系统中 Edge 必须保持默认浏览器地位,且不能预装竞品浏览器的桌面快捷方式。对 PC 厂商来说,Windows 许可费是刚性成本,这些条款构成了经济层面的强制——你不用 Edge,你的用户就看不到你的品牌快捷方式以外的选择。

实际看看:注册表里的浏览器关联长什么样

下面这个 PowerShell 脚本可以直接在你的 Windows 机器上运行,它会读取当前系统中 http/https 协议和 .html/.htm 文件类型的默认关联,并显示 Hash 值。你可以对比"手动设置 Chrome 为默认后"和"经历一次系统更新后"的输出差异,亲眼看到微软如何用 Hash 校验来锁定你的选择。

# 查看当前浏览器默认关联与 Hash 校验值
# 在 PowerShell 中直接运行,无需管理员权限

$protocols = @("http", "https")
$extensions = @(".html", ".htm")

function Get-Assoc($keyPath) {
    try {
        $item = Get-Item $keyPath -ErrorAction Stop
        $progId = $item.GetValue("ProgId", "(未设置)")
        $hash   = $item.GetValue("Hash",   "(无 Hash)")
        return @{ ProgId = $progId; Hash = $hash }
    } catch {
        return @{ ProgId = "(键不存在)"; Hash = "(N/A)" }
    }
}

Write-Host "=== 协议级默认关联 ===" -ForegroundColor Cyan
foreach ($proto in $protocols) {
    $path = "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\$proto\UserChoice"
    $result = Get-Assoc $path
    Write-Host "$proto -> ProgId: $($result.ProgId), Hash: $($result.Hash)"
}

Write-Host ""
Write-Host "=== 文件类型默认关联 ===" -ForegroundColor Cyan
foreach ($ext in $extensions) {
    $path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$ext\UserChoice"
    $result = Get-Assoc $path
    Write-Host "$ext -> ProgId: $($result.ProgId), Hash: $($result.Hash)"
}

Write-Host ""
Write-Host "提示:ProgId 为 ChromeHTML 表示 Chrome,FirefoxHTML-XXXX 表示 Firefox," -ForegroundColor Yellow
Write-Host "MSEdgeHTM 表示 Edge。Hash 值由系统生成,篡改 ProgId 而不更新 Hash 会导致回退。" -ForegroundColor Yellow

运行方式:复制到 PowerShell 窗口直接执行即可。

预期观察

  • 如果你手动把 Chrome 设为默认浏览器,ProgId 应显示 ChromeHTMLHash 是一个由当前用户 SID 和时间戳计算出的值。
  • 经历 Windows 更新后再次运行,你很可能看到 ProgId 已被静默改回 MSEdgeHTM,Hash 也随之变化——这就是"更新即重置"的注册表证据。
  • 如果你尝试手动修改注册表中的 ProgId 而不更新 Hash,系统会在下次登录时自动忽略你的修改。

第三方浏览器的应对困境

公开信中提到,Chrome 和 Firefox 目前只能通过调用 ShellExecute 打开系统设置页面来"引导"用户手动切换。这不是技术能力不足,而是微软没有提供真正的 API——所谓的"开放 API"本质上只是一个快捷方式,指向那个需要逐项点击确认的设置界面。

对比 macOS 和 Linux 的做法:macOS 上修改默认浏览器是一个单选操作,系统不会反复弹窗劝阻;Linux 桌面环境下默认浏览器设置通常在系统设置中一步完成,没有 Hash 校验机制。微软的做法在技术上是刻意增加摩擦,而非必要的安全措施。

给开发者和用户的实际建议

如果你是 Windows 用户或企业 IT 管理员,以下策略可以部分缓解微软的锁定:

个人用户

  1. 用上面的脚本定期检查默认关联是否被静默重置。
  2. 在 Windows 设置中关闭"推荐使用 Edge"的提示:设置 → 应用 → 默认应用 → 底部关闭"在打开链接时推荐 Edge"。
  3. 如果使用 Firefox,可以安装 Edge Deflector 类工具拦截 microsoft-edge:// 协议强制跳转(注意此类工具可能被后续更新封堵)。

企业 IT 管理员

可以通过组策略一次性锁定浏览器偏好,绕过 Hash 校验问题:

# 企业环境:通过组策略设置默认浏览器(需管理员权限)
# 此方法绕过 UserChoice Hash 机制,适用于域控环境

$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System"

# 创建键(如不存在)
if (-not (Test-Path $regPath)) {
    New-Item -Path $regPath -Force | Out-Null
}

# 设置默认浏览器关联配置文件路径
# 需要先准备一个 XML 关联配置文件,参考:
# https://learn.microsoft.com/en-us/windows/client-management/mdm/applocker-csp

Set-ItemProperty -Path $regPath -Name "DefaultAssociationsConfiguration" -Value "C:\IT\DefaultAssociations.xml" -Type String

Write-Host "已设置组策略级默认关联配置。" -ForegroundColor Green
Write-Host "下一步:创建 DefaultAssociations.xml 文件,内容示例如下:" -ForegroundColor Yellow

对应的 XML 文件示例(保存为 C:\IT\DefaultAssociations.xml):

<?xml version="1.0" encoding="UTF-8"?>
<DefaultAssociations>
  <Association Identifier=".html" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".htm"  ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="http"  ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="https" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
</DefaultAssociations>

组策略方式在企业环境中有效,因为 DefaultAssociationsConfiguration 覆盖了 UserChoice 的 Hash 机制,且不会被普通系统更新重置。

竞争失序的真正代价

微软的行为不只是让用户多点几次鼠标。它实质上扭曲了浏览器市场的竞争信号:当操作系统厂商可以反复把用户推回自家浏览器,浏览器之间的性能、隐私、功能竞争就不再是决定市场份额的主导因素。OEM 厂商被迫配合,意味着新机器出厂时用户的选择空间就已经被压缩。

欧盟此前通过浏览器选择屏(Browser Choice Screen)机制一度改善了这一局面,但该机制在 2014 年到期后未续期。浏览器选择联盟的公开信正是要求欧盟重新介入,并在 Windows 11 的新架构下设计更有效的选择机制。

对开发者来说,浏览器垄断不只是"用哪个浏览器"的问题——它直接影响 Web 标准的演进方向。当一个浏览器凭借 OS 锁定获得不合理的市场份额,其厂商对标准的偏离就有更大的影响力,最终损害的是整个 Web 生态的开放性。


相关推荐