PowerShell编写Chrome/Edge扩展白名单注册表脚本重复写入问题求助
问题成因
- 初始版本核心错误:写入注册表的操作放在了条件判断之前,每次循环遍历扩展时,不管后续是否判断已存在,
Set-RegString命令都会先执行一次,直接写入新条目,这是重复写入的核心原因。 - 简化版本错误:你定义的
$NewChromeWhiteListedApps数组元素是纯字符串(扩展ID+更新地址),过滤时调用了不存在的$_.Name属性,导致过滤逻辑完全失效,所有扩展都会被判定为未存在,每次都执行写入。 - 最终判断版本错误:你用数组
$ChromeWhitelistRegistryList直接和单个扩展字符串做-eq/-ne比较,PowerShell中数组和单个元素比较不会返回布尔值,而是返回匹配到的元素/空值,导致判断逻辑永远触发Elseif分支,每次都写入新条目。
修复方案
统一逻辑为提前拉取现有注册表白名单,仅在扩展未存在时执行写入操作,修复后完整代码如下:
# 基础配置 $DefaultAppUpdateURL = "https://clients2.google.com/service/update2/crx" $computer = "MS107B44463257" # 浏览器注册表路径定义 $ChromeWhiteListPath = "SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist" $EdgeWhiteListPath = "SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallForcelist" # 白名单扩展列表 $WhitelistApps = @( "falnmchlgbngpmiifgbpgophmdflgiff;$DefaultAppUpdateURL", # Serene "hdokiejnpimakedhajhdlcegeplioahd;$DefaultAppUpdateURL", # Lastpass "gighmmpiobklfepjocnamgkkbiglidom;$DefaultAppUpdateURL" # ADBlocker ) # 提前拉取现有注册表白名单,避免重复查询 try { $existingChrome = Get-RegValue -ComputerName $computer -Hive LocalMachine -Key $ChromeWhiteListPath | Select-Object -ExpandProperty Data $existingEdge = Get-RegValue -ComputerName $computer -Hive LocalMachine -Key $EdgeWhiteListPath | Select-Object -ExpandProperty Data } catch { # 首次运行注册表路径不存在时初始化空数组 $existingChrome = @() $existingEdge = @() } foreach ($app in $WhitelistApps) { # 处理Chrome白名单 if ($app -notin $existingChrome) { $newChromeIdx = $existingChrome.Count + 1 Set-RegString -ComputerName $computer -Hive LocalMachine -Key $ChromeWhiteListPath -Value $newChromeIdx -Data $app -Force $existingChrome += $app # 更新本地缓存的列表,避免后续重复判断 Write-Host "$app 已添加到Chrome白名单" -ForegroundColor Green } else { Write-Host "$app 已存在于Chrome白名单" -ForegroundColor Gray } # 处理Edge白名单 if ($app -notin $existingEdge) { $newEdgeIdx = $existingEdge.Count + 1 Set-RegString -ComputerName $computer -Hive LocalMachine -Key $EdgeWhiteListPath -Value $newEdgeIdx -Data $app -Force $existingEdge += $app Write-Host "$app 已添加到Edge白名单" -ForegroundColor Green } else { Write-Host "$app 已存在于Edge白名单" -ForegroundColor Gray } }
修复后逻辑仅在首次运行或新增白名单扩展时执行写入操作,重复运行不会产生冗余条目,同时增加了注册表路径不存在的异常处理,首次运行无需提前手动创建对应路径。
内容的提问来源于stack exchange,提问作者ThrowAway
相关产品推荐
相关产品推荐

