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



我正在寻找一种从远程打印机中删除注册表项/值的方法,键/值包括名称"(umgeleitet",因为它们正在减慢整个RDP会话的速度。但是我想备份它们,以防万一删除了不应该删除的内容

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

$Folder = "C:UsersPublicDocumentsBackup"
Reg export HKU "$FolderBackup.reg"
Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where { $_.Name -match "(umgeleitet *)"}>> "$FolderLog.log"
Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where { $_.Name -match "(umgeleitet *)"} | Remove-Item -Force -Recurse

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

导出

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

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

具体来说,你可以通过管道将以下命令reg export如下,以创建file1.regfile2.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

我稍微重写了注册表查询,以匹配PSChildName属性,该属性更短,匹配速度更快。

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

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

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

Tee-Object命令告知 PowerShell 将输出写入屏幕,并将追加的项目放入指定的文件路径中。 然后我们将注册表键值也写出到文件中。

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

运行中 :

Removing HKEY_CURRENT_USERSoftwareumgeleitet
Removing HKEY_CURRENT_USERSoftwareumgeleitet2
Removing HKEY_CURRENT_USERSoftwareumgeleitetTheAwakening

并创建了日志文件的截图:

Removing HKEY_CURRENT_USERSoftwareumgeleitet
Hive: HKEY_CURRENT_USERSoftware
Name                           Property                                                                                           
----                           --------                                                                                           
umgeleitet                     SomeTestValue : true

完成的代码

$Folder = "C:UsersPublicDocumentsBackup"
Reg export HKU "$FolderBackup.reg"
$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where PSChildName -match "(umgeleitet *)"
ForEach ($regkey in $matchingRegKeys){
"Removing $($regkey.Name)" | Tee-Object -Append "$FolderLog.log"
$regkey >> "$FolderLog.log"
Remove-Item -Path $regkey.PSPath
}

下面是 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:key1key2      name2 myvalue String
HKCU:key1key2key3 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_USERkey1key2 Property: name2".
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USERkey1key2key3 Property: name3".

最新更新