我正在尝试删除多台计算机中广告软件中留下的垃圾注册表项。广告软件在以下路径中创建了注册表项:
HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \
属性:机器之间的随机名称不同
值:机器之间相同的恶意字符串
Get-ChildItem -path HKLM:\System\Controlset001\Services |
Get-ItemProperty |
Where-Object {$_.ValueName -eq "Value"} |
Remove-ItemProperty -ErrorAction SilentlyContinue
当我知道子键和属性时,我尝试了上述方法删除键,但是由于属性是随机的,所以没有任何结果。非常感谢你!
答案 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