浏览器选择联盟(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应显示ChromeHTML,Hash是一个由当前用户 SID 和时间戳计算出的值。 - 经历 Windows 更新后再次运行,你很可能看到
ProgId已被静默改回MSEdgeHTM,Hash 也随之变化——这就是"更新即重置"的注册表证据。 - 如果你尝试手动修改注册表中的
ProgId而不更新Hash,系统会在下次登录时自动忽略你的修改。
第三方浏览器的应对困境
公开信中提到,Chrome 和 Firefox 目前只能通过调用 ShellExecute 打开系统设置页面来"引导"用户手动切换。这不是技术能力不足,而是微软没有提供真正的 API——所谓的"开放 API"本质上只是一个快捷方式,指向那个需要逐项点击确认的设置界面。
对比 macOS 和 Linux 的做法:macOS 上修改默认浏览器是一个单选操作,系统不会反复弹窗劝阻;Linux 桌面环境下默认浏览器设置通常在系统设置中一步完成,没有 Hash 校验机制。微软的做法在技术上是刻意增加摩擦,而非必要的安全措施。
给开发者和用户的实际建议
如果你是 Windows 用户或企业 IT 管理员,以下策略可以部分缓解微软的锁定:
个人用户:
- 用上面的脚本定期检查默认关联是否被静默重置。
- 在 Windows 设置中关闭"推荐使用 Edge"的提示:设置 → 应用 → 默认应用 → 底部关闭"在打开链接时推荐 Edge"。
- 如果使用 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 生态的开放性。