有没有办法搜索注册表项和值,导出并删除它们

时间:2019-08-22 13:17:01

标签: powershell get-childitem

我正在寻找一种从远程打印机删除注册表项/值的方法,这些项/值包括名称“(umgeleitet”,因为它们会使整个RDP-Session变慢。但是我想仅将它们备份在删除不应该的东西

我已经尝试使用Get-ChildItemGet-ItemProperty

$Folder = "C:\Users\Public\Documents\Backup"
Reg export HKU "$Folder\Backup.reg"
Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where { $_.Name -match "(umgeleitet *)"}>> "$Folder\Log.log"
Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where { $_.Name -match "(umgeleitet *)"} | Remove-Item -Force -Recurse

上面的代码不会只删除键值。

3 个答案:

答案 0 :(得分:1)

导出

您的问题已经显示了正确的解决方案用法:reg.exe export <key-path> <file>将注册表项的子树导出到文件中。

请注意,如果要导出如下所示的特定键,则必须reg export分别调用每个文件reg export,因为reg export仅支持单个目标键路径,并且不支持附加到现有文件。

具体来说,您可以按以下方式将下面的命令通过管道传递到file1.reg,以创建file2.reg$i = 1 Get-ChildItem -path REGISTRY::... | ForEach-Object { reg.exe export $_.Name "file$(($i++)).reg" } ,...文件:

Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | Where-Object { 
  $_.GetValueNames() -match '\(umgeleitet .*\)'
}

通过匹配键的值名称 来定位键:

-match

请注意,必须对(使用正确的正则表达式,其中必须将)和原义的\.*转义,其中(umgeleitet *)代表任何字符序列。 相反,您使用的-like是与Remove-Item一起使用的通配符表达式(尽管请注意,通配符表达式必须与整个输入字符串)。

如果要与值数据匹配,则需要做更多的工作。


删除找到的密钥,只需将上面的内容通过管道传递到... | Remove-Item -Force -Recurse ,如您的问题:

C:\Users\Hamza Lachi\AppData\Local\Programs\Python\Python37-32\Scripts

答案 1 :(得分:0)

我重写了一点注册表查询,以匹配PSChildName属性,该属性较短,并且匹配速度更快。

$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where PSChildName -match "(umgeleitet *)"

您会注意到,我还将结果放入一个变量中,以便我们可以通过简单的ForEach循环遍历它们。

ForEach ($regkey in $matchingRegKeys){
    "Removing $($regkey.Name)" | Tee-Object -Append "$Folder\Log.log"
    $regkey >> "$Folder\Log.log"
    Remove-Item -Path $regkey.PSPath
}

Tee-Object命令告诉PowerShell将输出既写入屏幕,又将附加到指定文件路径中的项目放置到屏幕上。然后我们将regkeys值也写到文件中。

最后,我们调用Remove-Item并提供$regkey.PSPath属性,该属性对应于键的完整路径,因此您可以清除键和任何值。

操作中:

Removing HKEY_CURRENT_USER\Software\umgeleitet
Removing HKEY_CURRENT_USER\Software\umgeleitet2
Removing HKEY_CURRENT_USER\Software\umgeleitetTheAwakening

并创建了一个日志文件的片段:

Removing HKEY_CURRENT_USER\Software\umgeleitet
    Hive: HKEY_CURRENT_USER\Software
Name                           Property                                                                                           
----                           --------                                                                                           
umgeleitet                     SomeTestValue : true

完整的代码

$Folder = "C:\Users\Public\Documents\Backup"
Reg export HKU "$Folder\Backup.reg"
$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where PSChildName -match "(umgeleitet *)"

ForEach ($regkey in $matchingRegKeys){
    "Removing $($regkey.Name)" | Tee-Object -Append "$Folder\Log.log"
    $regkey >> "$Folder\Log.log"
    Remove-Item -Path $regkey.PSPath
}

答案 2 :(得分:0)

这是get-itemproperty的替代脚本:

# get-itemproperty2.ps1
# get-childitem skips top level key properties, use get-item for that

# example pipe to set-itemproperty:
# ls -r hkcu:\key1 | get-itemproperty2 | where value -match value | 
#   set-itemproperty -value myvalue -whatif

param([parameter(ValueFromPipeline)]$key)

process { 
  $valuenames = $key.getvaluenames() 

  if ($valuenames) { 
    $valuenames | 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)
      }
    }
  } else {
    [pscustomobject] @{
      Path = $key -replace 'HKEY_CURRENT_USER',
        'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
        Name = ''
        Value = ''
        Type = ''
    }
  }
}

然后您可以执行以下操作:

ls -r hkcu:\key1 | .\get-itemproperty2 | where value -match value

Path                 Name  Value     Type
----                 ----  -----     ----
HKCU:\key1\key2      name2 myvalue String
HKCU:\key1\key2\key3 name3 myvalue String


ls -r hkcu:\key1 | .\get-itemproperty2 | where value -match value | Remove-ItemProperty -WhatIf
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USER\key1\key2 Property: name2".
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USER\key1\key2\key3 Property: name3".