如何使用随机名称删除注册表属性

时间:2019-10-15 01:51:24

标签: powershell

我正在尝试删除多台计算机中广告软件中留下的垃圾注册表项。广告软件在以下路径中创建了注册表项:

HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \

属性:机器之间的随机名称不同

值:机器之间相同的恶意字符串

Get-ChildItem -path HKLM:\System\Controlset001\Services | 
  Get-ItemProperty |
    Where-Object {$_.ValueName -eq "Value"} |
      Remove-ItemProperty -ErrorAction SilentlyContinue

当我知道子键和属性时,我尝试了上述方法删除键,但是由于属性是随机的,所以没有任何结果。非常感谢你!

2 个答案:

答案 0 :(得分:0)

这是get-itemproperty的替代脚本:

# get-itemproperty2.ps1
param([parameter(ValueFromPipeline)]$key)
process { 
  $key.getvaluenames() |
  foreach {
    $value = $_
    [pscustomobject] @{
      Path = $key -replace 'HKEY_CURRENT_USER',
        'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
      Name = $Value
      Value = $Key.GetValue($Value)
      Type = $Key.GetValueKind($Value)
    }
  }
}

因此您可以执行以下操作:

Get-ChildItem HKLM:\System\Controlset001\Services | .\Get-ItemProperty2 |
  Where Value -eq MyValue | Remove-ItemProperty -Whatif

答案 1 :(得分:0)

您的任务不需要使用Get-ItemProperty(并且 无需重新实现它的变体,就像currently accepted answer那样)

相反,使用已知属性名称(注册表值名称),通过应用于感兴趣的注册表路径的每个子项的.GetValue()方法的输出进行过滤:

# Specify whatever fixed value the malware stored in the 'ImagePath'
# property of the randomly named keys.
$propValue = '...'

Get-ChildItem -LiteralPath HKLM:\System\ControlSet001\Services |
  Where-Object { $_.GetValue('ImagePath') -eq $propValue } |
    Remove-Item -WhatIf

注意:Common parameter -WhatIf 预览该操作;删除它以执行实际操作。

  • Get-ChildItem -LiteralPath HKLM:\System\ControlSet001\Services枚举指定路径的所有子项。

  • Where-Object { $_.GetValue('ImagePath') -eq $propValue }仅选择其ImagePath属性具有指定值的那些子项。

  • Remove-Item然后删除选定的子项。


如果要在输入键的所有属性(注册表值)中查找数据(属性值),则可以使用以下方法:

$propValue = '...'

Get-ChildItem -LiteralPath HKLM:\System\ControlSet001\Services |
  Where-Object { 
    foreach ($name in $_.GetValueNames()) { 
      if ($_.GetValue($name) -eq $propValue) { return $true } } 
    }
  }| Remove-Item -WhatIf