资讯详情

PowerShell注册表检测:精准识别Windows所有正常安装的浏览器

📅 2026/9/24 19:57:00 | 华诺云谱 👁 阅读
PowerShell注册表检测:精准识别Windows所有正常安装的浏览器
有次帮公司做终端软件资产盘点领导给我的需求就一句话“获取电脑的全部浏览器仅限正常安装的浏览器。”我第一反应是打开开始菜单数一遍图标几分钟就能交差。结果真去统计的时候发现完全不是这么回事——有人在C盘根目录丢了个绿色版Chrome有人机器里躺着四五个Chromium内核套壳软件还有人明明卸载了Firefox开始菜单快捷方式却还残留在那儿。更要命的是Edge和IE是系统自带算不算“安装的浏览器”这个边界不划清楚后面所有统计都会乱套。这篇文章我就把整个思路和实现过程完整写出来。我会先解释为什么“认出全部浏览器”这件事没有表面看起来那么简单再对比几种常见做法的优劣最后给出我实际在用的PowerShell检测脚本并逐段讲清楚每个关键步骤的理由。面向的读者是那些需要做批量装机、IT资产盘点、多浏览器自动化测试或者软件合规审查的同学哪怕你之前没写过注册表读取脚本照着思路也能快速上手。1. 为什么“认出全部浏览器”没有想象中简单1.1 浏览器在Windows上留下的“安装痕迹”有好几处一台Windows电脑上一个浏览器被“正常安装”之后至少会在以下几个地方留下痕迹安装目录比如C:\Program Files\Google\Chrome\Application开始菜单快捷方式通常在C:\ProgramData\Microsoft\Windows\Start Menu\Programs或用户目录下注册表卸载项路径是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallApp Paths注册表项用来支持在“运行”框直接输入chrome.exe启动程序默认程序关联比如.html文件默认用哪个浏览器打开。听起来不少但真正麻烦的是这些痕迹并不是等价的。一个绿色版浏览器解压到一个文件夹里就能用它有安装目录也可以在桌面建个快捷方式但它没有卸载项也没有App Paths。一个已经卸载的浏览器安装目录和快捷方式可能被清理掉但注册表卸载项却有可能残留下来。所以我们需要一种语义上最接近“正常安装”的判据而不是单纯看“有没有这个文件”或“有没有这个快捷方式”。1.2 “正常安装”到底用什么标准界定结合标题里的限定条件“仅限正常安装的浏览器”我定的标准是必须存在于注册表卸载项中说明它具备“可通过控制面板/设置卸载”的资格必须能定位到实际存在的可执行文件比如chrome.exe或firefox.exe可执行文件的文件名必须落在已知浏览器名单内用来排除那些名字里带“Browser”但不是浏览器的软件。这套标准不是唯一的但是最接近普通用户和IT运维对“正常安装”的理解。安装程序在写入卸载项时通常还会写入DisplayName、DisplayVersion、DisplayIcon、InstallLocation这些字段这正好帮我们拿到浏览器的名称、版本、图标路径和安装路径。便携版几乎不会往卸载注册表里写东西所以能天然地过滤掉“绿色软件”。2. 枚举思路的取舍我为什么选注册表为主2.1 直接扫文件目录的问题最容易想到的办法是把常见浏览器安装目录都扫一遍比如检测chrome.exe、firefox.exe在不在。但实际跑下来会发现误报和漏报都很多。Chrome可能装在Program Files也可能装在AppData\LocalFirefox的安装目录经常带版本号同一时间还可能存在升级残留目录更不用说某些浏览器套着Chromium内核目录里也放着chrome.exe开头或类似的进程名。而且目录扫描没法回答一个关键问题这个浏览器是真的“装过”还是别人丢了个解压包如果你把便携版也算进去统计结果就会多出许多“实际上没人用”的浏览器。2.2 只读开始菜单快捷方式的问题有人喜欢用扫描开始菜单.lnk快捷方式的方式来找浏览器因为快捷方式代表了“用户能看到的入口”。这个思路在交互式排查时很好用但放到脚本里就不够可靠快捷方式可以被优化软件清理也可以由用户手动创建连一个绿色的firefox.exe都可以被自己拖一个快捷方式到桌面。出现快捷方式并不能证明它经过正规安装流程反过来某些静默安装的浏览器也可能不创建快捷方式。2.3 注册表为主的路线确定所以我的最终方案是把注册表卸载项作为主数据源App Paths作为辅助校验文件存在性作为兜底过滤。大致关系如下方案优点缺点是否采用扫描安装目录简单直接能看到文件实体无法区分便携版和正规安装误报高不采用扫描快捷方式反映用户可见入口可被手动创建/清理语义不稳定不采用读卸载注册表最接近“正常安装”字段完整需处理32/64位视图、关键词过滤采用App Paths辅助校验能验证是否可被系统启动里面也有非浏览器程序辅助采用选定注册表为主之后实际操作时还要注意一个基础事实64位Windows上有两套卸载注册表一套是64位软件视角的原生路径另一套是32位软件视角的WOW6432Node路径。如果你只扫其中一个大约会漏掉一半软件。这一点后面专门展开讲。3. 完整实现——PowerShell脚本逐步拆解3.1 先搭好卸载项的扫描路径下面这个函数就是整个脚本的地基。它扫描三个位置的卸载项64位软件的卸载项、32位软件在WOW6432Node下的卸载项以及当前用户的卸载项。$uninstallPaths ( HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* )读注册表我选PowerShell而不是批处理是因为Get-ItemProperty能直接返回一个包含所有字段的对象后续筛选和处理会非常舒服。这里有个小坑如果路径本身不存在Get-ItemProperty会报错所以要先做Test-Path判断。3.2 关键词过滤规则不能太宽也不能太窄接下来是过滤逻辑。卸载项里有很多非浏览器软件不能光靠“名字里有没有Browser”来判断。我的做法是配一个浏览器名称特征正则再配合可执行文件白名单做二次确认。$namePattern Chrome|Firefox|Internet Explorer|Edge|Opera|Brave|Vivaldi|360|QQBrowser|Sogou|Liebao|Maxthon|CentBrowser你可能会想直接用Edge当关键词会不会把“Microsoft Edge Update”这种更新程序误报进来会。所以后面必须再过一遍可执行文件名白名单只认msedge.exe不认msedgeupdate.exe。这就是“名字过滤宽、文件名校验窄”的组合拳。3.3 解析DisplayIcon和InstallLocation卸载项里最关键的两个字段是DisplayIcon和InstallLocation。DisplayIcon通常指向浏览器的exe文件但它经常会带一个显示图标索引比如C:\Program Files\...\chrome.exe,0。这个逗号后面的数字是给资源管理器选图标用的取值时必须截掉。$iconPath $item.DisplayIcon if ($iconPath -match ,) { $iconPath ($iconPath -split ,)[0].Trim() }如果DisplayIcon为空或者解析出来的路径不存在再用InstallLocation拼接常见exe文件名来补位。InstallLocation有时候包含引号也要去掉否则Test-Path会误判。3.4 文件白名单校验和去重拿到exe路径后统一提取文件名再和已知浏览器进程名单比对。这个名单尽量覆盖主流的、你所在环境可能出现的浏览器比如chrome.exe、firefox.exe、msedge.exe、iexplore.exe、opera.exe、brave.exe、vivaldi.exe、360se.exe、360chrome.exe、QQBrowser.exe、SogouExplorer.exe、Maxthon.exe、CentBrowser.exe。$knownExecutableNames ( chrome.exe, firefox.exe, msedge.exe, iexplore.exe, opera.exe, brave.exe, vivaldi.exe, 360se.exe, 360chrome.exe, QQBrowser.exe, SogouExplorer.exe, Maxthon.exe, CentBrowser.exe )去重逻辑也要放到这步。同一个浏览器可能同时出现在64位和32位卸载项里也可能在HKLM和HKCU各出现一次。我给输出对象增加了一个Key字段由DisplayName exe路径组成最后用哈希表做去重。3.5 完整脚本和运行效果整合之后的核心函数如下function Get-InstalledBrowser { param( [switch]$IncludeResidual ) $uninstallPaths ( HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* ) $namePattern Chrome|Firefox|Internet Explorer|Edge|Opera|Brave|Vivaldi|360|QQBrowser|Sogou|Liebao|Maxthon|CentBrowser $rawItems foreach ($path in $uninstallPaths) { if (Test-Path $path) { Get-ItemProperty -Path $path -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -match $namePattern } } } $knownExecutableNames ( chrome.exe, firefox.exe, msedge.exe, iexplore.exe, opera.exe, brave.exe, vivaldi.exe, 360se.exe, 360chrome.exe, QQBrowser.exe, SogouExplorer.exe, Maxthon.exe, CentBrowser.exe ) $browserMap {} foreach ($item in $rawItems) { $displayName $item.DisplayName if (-not $displayName) { continue } $displayIcon $item.DisplayIcon if ($displayIcon -match ,) { $displayIcon ($displayIcon -split ,)[0].Trim() } $exePath $null if ($displayIcon -and (Test-Path $displayIcon)) { $exePath $displayIcon } elseif ($item.InstallLocation) { $installDir $item.InstallLocation.Trim() foreach ($exeName in $knownExecutableNames) { $candidate Join-Path $installDir $exeName if (Test-Path $candidate) { $exePath $candidate break } } } if (-not $exePath) { continue } $exeName Split-Path $exePath -Leaf if ($knownExecutableNames -notcontains $exeName) { continue } $key $displayName|$exePath if ($browserMap.ContainsKey($key)) { continue } $browserMap[$key] [PSCustomObject]{ DisplayName $displayName Version $item.DisplayVersion ExecutablePath $exePath InstallPath $item.InstallLocation Publisher $item.Publisher Residual $false } } return $browserMap.Values | Sort-Object DisplayName }调用方式很简单Get-InstalledBrowser | Format-Table -AutoSize输出结果类似DisplayName Version ExecutablePath ------------------ ------------ ---------------------------------------- Google Chrome 121.0.6167.85 C:\Program Files\Google\Chrome\Application\chrome.exe Microsoft Edge 121.0.2277.83 C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe Mozilla Firefox 122.0 C:\Program Files\Mozilla Firefox\firefox.exe如果只想快速生成一份清单供人工复核可以直接导出CSVGet-InstalledBrowser | Export-Csv -Path .\browser-list.csv -NoTypeInformation -Encoding UTF8导出CSV时用-Encoding UTF8很重要否则Excel打开中文名称会乱码。这个坑我踩过不止一次。4. 实测中遇到的坑和兜底处理4.1 名称过滤误伤Internet Download Manager第一次跑脚本时我把关键词定义得太宽松包含了“Internet”结果把“Internet Download Manager”也识别成浏览器了。IDM确实会处理浏览器的下载请求但它自己不是一个网页浏览器。这种误报靠名字正则没法彻底解决只能靠可执行文件白名单来兜底。所以我在迭代版本里把过滤逻辑改成了“DisplayName先粗筛exe文件名再细筛”误报率降到了很低的水平。4.2 名称过滤漏网各种套壳浏览器和误伤对应的是漏网。国产环境里“XX导航浏览器”“XX高速浏览器”这类程序DisplayName写得五花八门光靠关键词很容易漏。你需要把已知的浏览器exe名单维护成一个常量数组一旦看到新出现的套壳浏览器就把它的exe名加进去。这个名单会随业务环境变化不可能一步到位我自己的做法是每个季度根据安全软件的扫描记录补充一次。4.3 32位和64位注册表视图只扫描HKLM:\Software\...\Uninstall会漏掉大量32位软件。Windows为兼容32位程序把它们重定向到了HKLM:\Software\WOW6432Node\...。浏览器这种软件Edge经常是64位Chrome也分32和64位安装版本Firefox更是两者都有所以两边都得扫。这个不算技术难点但容易忘忘了就是一份残缺清单。4.4 用户级安装和系统级安装并存还有一个容易忽视的点Chrome和Firefox都支持“仅当前用户安装”这种安装方式写在HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall下面而不是HKLM。如果一台机器的浏览器装在用户目录HKLM里根本看不到。把HKCU的卸载项加入扫描范围才能把这类情况覆盖住。当然存在一个前提脚本要给每个用户分别跑或者正在做离线ntuser.dat挂载排查否则只能看到当前登录用户的用户级安装项。这一点在批量盘点时要特别说明避免交付结果时被质疑。4.5 残留卸载项和手工清理最后一个高频坑是残留卸载项。用户手动删掉了安装目录但注册表卸载项还留着。此时DisplayIcon指向的exe已经不存在。默认情况下我会把这类条目标记成Residual $true并过滤掉因为严格来说它已经不是一个“正常安装”的浏览器了。但过滤不等于忽略我建议在日志里单独输出一份“不存在的程序路径”交给资产盘点时人工清理注册表。这部分坑位汇总如下现象原因处理方式IDM列入浏览器结果名称含“Internet”被误匹配用exe白名单二次校验套壳浏览器漏报DisplayName无知名品牌维护已知exe名单并定期补充32位软件找不到没扫WOW6432Node视图扫描三个卸载路径用户级安装查不到卸载项在HKCU扫描HKCU卸载项已删除软件仍列出注册表残留检测exe是否存在并标记Residual5. 这套检测逻辑的延伸用法5.1 多浏览器自动化测试的环境清点做Selenium或Playwright这类自动化测试时最烦的就是不知道测试机到底装了哪些浏览器。用这个脚本先把环境摸清再动态生成浏览器矩阵能省掉大量手工确认。脚本输出里的ExecutablePath可以直接传给浏览器启动参数Version字段也能写进测试报告。5.2 批量远程盘点PowerShell脚本稍加改造就能支持远程机器列表。把获取浏览器清单的逻辑封装成函数再用Invoke-Command -ComputerName批量执行汇总成一张表。远程执行时注意HKCU有用户上下文问题建议阅读说明文档时明确它反映的是“机器级安装项 当前执行账户的用户级安装项”。对于多数资产盘点需求机器级安装项已经足够用户级安装则需要配合登录脚本来采集。5.3 软件资产台账与安全基线检查很多安全基线要求里会明确规定允许安装哪些浏览器、禁止哪些浏览器。用这个脚本扫出实际安装情况再和安全基线比对可以直接找出违规项。对于老旧版本比如某个Chrome版本存在高危漏洞Version字段就能发挥作用过滤出低于最低版本要求的机器列表。5.4 卸载残留的定期巡检把巡检任务挂到任务计划程序每周扫一次注册表卸载项找出DisplayIcon指向不存在文件的残留项并自动记录。这属于比较典型的注册表健康检查应用和我这个脚本的底层逻辑完全一致。我在实际跑这个需求的时候发现最有价值的其实不是那个“最终列表”而是中间暴露出来的边界问题什么算浏览器、什么算正常安装、用户级和系统级怎么合并、残留项怎么处理。这些边界一旦理清脚本本身只是几行注册表读取加字符串清洗。如果你也想做类似的盘点我建议给你的输出结果加一个“人工复核”列。机器扫描可以帮你把范围缩得很小但最终上台账的清单最好还是让会实际操作的人过一遍眼睛。尤其是套壳软件多的环境这一步能省掉后续很多扯皮。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。