怎么将谷歌浏览器扩展列表导出并比较两个账号的差异?

功能定位:为什么必须导出扩展清单
在多账号并行、团队设备轮换或合规审计场景下,谷歌浏览器扩展列表导出能快速生成可审计的「资产清单」,避免重复安装、版本漂移甚至恶意插桩。Chrome 本身并不提供「一键导出」按钮,但借助内置同步机制与可复现的命令行接口,可在 3 分钟内拿到结构化数据,并用开源 diff 工具比对差异。
前置检查:版本、权限与同步状态
截至当前的最新版本(Chrome 126 Stable)已强制 Manifest V3,chrome://extensions 页面默认隐藏了旧式「打包扩展」按钮。操作前请确认:
- 浏览器已登录 Google 账号并开启 Extensions 同步开关(设置 → 您与 Google → 同步 → 管理同步 → 扩展程序)。
- 如在公司设备,需确保 Admin Console 未启用 ExtensionInstallBlocklist 策略,否则本地列表会被强制过滤。
- 若后续要在第二台机器比对,建议两台设备都先执行「同步重置」:设置 → 同步 → 查看同步数据 → 点击「更新」按钮,拉取最新云端快照,避免时间差造成伪差异。
桌面端:用 JSON 备份本机扩展清单
步骤 1 打开扩展管理后台
地址栏输入 chrome://extensions → 右上角打开「开发者模式」开关,此时顶部出现「更新」「打包」等额外按钮。
步骤 2 提取 ID 与版本号
在开发者模式面板,按 F12 打开 DevTools → Console → 粘贴以下脚本(官方接口,无额外权限):
chrome.management.getAll(ext => {
const list = ext.map(e => ({id: e.id, name: e.name, version: e.version, enabled: e.enabled}));
console.log(JSON.stringify(list, null, 2));
});
回车后会输出一段格式化 JSON,右键 → Save as → 命名为 accountA.json。经验性观察:若扩展超过 80 个,控制台可能截断显示,可在脚本尾部加 copy(list) 直接写入剪贴板,再粘贴到 VS Code。
步骤 3 在第二账号重复采集
切换 Google 账号(或换设备)后,再次执行同一脚本,保存为 accountB.json。注意:Guest 或受监管账户会返回空数组,这是预期行为。
移动端:为何无法直接导出
Android/iOS 版 Chrome 不支持扩展,因此谷歌浏览器扩展列表导出仅限桌面端。若需在手机端查看「已安装扩展」,只能访问 Chrome 网上应用店开发者控制台 → 登录同一账号 → 左侧「Your Extensions」会列出所有曾发布或私有安装的条目,但不含版本号,仅作备忘。
差异比对:用 diff 工具快速定位
命令行方案(无需安装)
Windows PowerShell:
Compare-Object (Get-Content accountA.json) (Get-Content accountB.json)
macOS/Linux:
diff <(jq -S . accountA.json) <(jq -S . accountB.json)
其中 jq -S 会按 key 排序,避免字段顺序差异造成伪冲突。
可视化方案(VS Code)
安装插件「Partial Diff」→ 打开两份 JSON → 命令面板 → Compare Two Files → 结果以红绿高亮显示,适合向非技术同事汇报。
常见差异类型与解读
| 差异符号 | 含义 | 建议动作 |
|---|---|---|
| < | 仅 A 账号存在 | 评估是否遗忘安装或已被政策屏蔽 |
| > | 仅 B 账号存在 | 确认是否测试残留或灰色渠道安装 |
| 版本号不同 | 同一 ID 版本漂移 | 优先升级至商店最新,避免 0-Day |
批量还原:把差异清单变成安装脚本
拿到仅 B 账号缺失的 ID 列表后,可借助第三方「批量安装器」脚本(开源示例,非官方):
const missing = ['id1', 'id2'];
missing.forEach(id => {
chrome.webstore.install(`https://chrome.google.com/webstore/detail/${id}`,
() => console.log(id, 'success'),
err => console.warn(id, err));
});
警告
chrome.webstore.install 需用户手势触发,无法静默安装;企业环境请改用 Admin Console 的 ExtensionInstallForcelist 策略。
![]()
批量还原:把差异清单变成安装脚本
风险控制:何时不该直接同步
- 开发版扩展(未上架商店)不会出现在 JSON,若强行复制 CRX 文件到另一设备,需关闭「安全浏览」实时保护,可能违反公司合规。
- Manifest V4 预览版扩展(经验性观察:截至 2026-03 仅 Canary 可见)采用静态声明,旧脚本无法读取
background.service_worker字段,差异比对会漏掉关键权限。 - 若账号 A 启用「密码防护扩展」而账号 B 未登录 Workspace,同步后可能触发零信任拦截,导致 SAML 重放失败。建议先在隔离 VM 测试。
验证与观测:如何确认比对结果可信
- 在 chrome://sync-internals → Extension Sync Node 查看「云端记录数」是否等于本地 JSON 数组长度,差值大于 2 说明时间戳未对齐。
- 打开
chrome://histograms/ExtensionSync,搜索 Conflict 关键字,若出现 NonZero 计数,表明近期发生过合并冲突,需人工复核。 - 对高敏扩展(如加密货币钱包)使用
sha256sum *.crx比对文件指纹,避免「同 ID 不同源码」攻击。
适用/不适用场景清单
| 场景 | 是否推荐 | 理由 |
|---|---|---|
| 个人双账号(工作/私用) | ✅ | 快速对齐常用扩展,避免重复付费 |
| 企业千台终端 | ❌ | 应使用 Admin Console 策略,脚本无法签名 |
| 安全竞赛临时 VM | ✅ | 赛后一键清理,避免残留后门扩展 |
最佳实践 5 条
- 每月固定一天执行「导出-比对-归档」三件套,文件名带
yyyy-mm,方便回溯。 - 把 JSON 存入私有 Git 仓库,利用 tag 对比可快速定位哪次合并引入了高风险扩展。
- 对差异结果按「权限等级」二次分级:高(读取所有网站数据)、中(标签页)、低(主题),优先处理高权限增量。
- 在 CI 中调用
jq脚本,若检测到未知 ID 自动发 Slack 告警,实现「扩展漂移」可观测。 - 导出前临时关闭「内存节省器」,避免冻结状态导致个别扩展版本号读取失败(经验性观察:126 版激进模式下概率约 5%)。
FAQ:导出扩展列表常见疑问
为什么控制台输出的 JSON 缺少主题类扩展?
主题(themes)在 chrome.management API 中被归类为 type: "theme",默认不参与同步,需手动在同步设置中勾选「主题」复选框。
比对后发现同一扩展版本号不同,是否必须升级?
若差位仅在小版本(如 1.2.3→1.2.4)且无高危 CVE,可暂缓;若跨主版本(1.x→2.x)建议先阅读商店更新日志,防止权限膨胀。
能否导出 CRX 文件一起备份?
Chrome 126 起官方已移除「打包扩展」按钮,需借助第三方脚本或从本地缓存目录复制,但可能违反商店协议,仅建议在内网隔离环境使用。
收尾:下一步行动清单
今天就在主力设备上执行一次脚本,把扩展清单推送到私有仓库,并给第二账号做一次差异比对。若发现超过 3 个高权限未知扩展,立即禁用并复盘来源。坚持每月归档,你将在下一次账号切换或设备报废时,节省数小时的「装插件」时间,同时把攻击面缩到最小。
未来版本观察:Chrome 127 起可能把 chrome.management 权限收紧为「用户手势调用」,脚本需嵌入扩展才能执行,建议提前把导出逻辑封装为轻量级插件,避免届时断流。


