求助:编写PowerShell脚本搜索注册表REG_BINARY值并删除匹配项
PowerShell 搜索并处理注册表REG_BINARY值
实现思路
要搜索注册表中存储为REG_BINARY类型的目标字符串,核心步骤是:
- 将目标字符串转换为注册表中对应的二进制编码(通常为UTF-16LE)
- 遍历指定路径下的所有注册表值,逐一对比二进制数据
脚本示例
# 配置搜索参数 $regPath = "HKCU\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\BagMRU" $targetString = "E:\" # 将目标字符串转为UTF-16LE编码的字节数组(匹配注册表中字符串转二进制的存储格式) $targetBytes = [System.Text.Encoding]::Unicode.GetBytes($targetString) # 遍历目标注册表路径下的所有值 Get-ItemProperty -Path "Registry::$regPath" | ForEach-Object { # 过滤掉PowerShell自带的属性,只处理注册表项的自定义值 $_.PSObject.Properties | Where-Object { $_.Name -notmatch "^PS" } | ForEach-Object { $valueName = $_.Name $binaryData = $_.Value # 检查当前二进制值是否与目标字节数组完全匹配 if ($binaryData -is [byte[]] -and (Compare-Object $binaryData $targetBytes -SyncWindow 0).Count -eq 0) { Write-Host "找到匹配项:值名称=$valueName,路径=$regPath" # 如需删除匹配项,取消注释下方代码 # Remove-ItemProperty -Path "Registry::$regPath" -Name $valueName -Force } } }
关键说明
- 编码转换:注册表中字符串转REG_BINARY存储时,默认使用UTF-16LE(Unicode)编码,因此必须用
[System.Text.Encoding]::Unicode.GetBytes()转换目标字符串,保证二进制格式匹配。 - 二进制对比:使用
Compare-Object对比字节数组,-SyncWindow 0参数确保两个数组的内容和顺序完全一致才判定为匹配。 - 遍历逻辑:
Get-ItemProperty获取注册表项的所有属性,通过过滤PS开头的属性(PowerShell内置属性),只处理实际的注册表值。 - 删除操作:如果需要删除找到的匹配项,取消注释脚本中的
Remove-ItemProperty行即可,-Force参数确保无需确认直接删除。
内容的提问来源于stack exchange,提问作者user20212555
相关产品推荐
相关产品推荐

