Как удалить свойства реестра со случайными именами - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь удалить ненужные элементы реестра, оставшиеся от рекламного ПО на нескольких машинах. Рекламное программное обеспечение создало ключи реестра по следующему пути:

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 голосов
/ 15 октября 2019

Использование Get-ItemProperty не требуется для вашей задачи (и нет необходимости повторно реализовать его вариант, как это делает в настоящее время принятый ответ ).

Вместо этого выполните фильтрацию по выходным данным метода .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

Примечание: Общий параметр -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
0 голосов
/ 15 октября 2019

Вот альтернативный скрипт для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...