PowerShell Registry Schlüssel finden und löschen
Hallo zusammen,
ich benötige Hilfe bei einem PS Skript.
Eigentlich möchte ich das ich unter diesem Pfad HKLM:\SYSTEM\CurrentControlSet\Enum\IDE ein Schlüssel Security gefunden wird ( falls vorhanden ) und diesen löscht.
Wenn dieser nicht vorhanden ist soll natürlich nix passieren.
Allerdings klappt es nicht. Ich habe auch schon einen Key erstellt und mit einem beliebigen Wert versehen, es wird nix gefunden.
Weiß jemand woran das liegt?
Hier das Skript.
Lg
Heiko
[Edit Biber] Titel angepasst. Alt: "Hilfe - Möchte ein Registry Schlüssel finden und löschen". [/Edit]
ich benötige Hilfe bei einem PS Skript.
Eigentlich möchte ich das ich unter diesem Pfad HKLM:\SYSTEM\CurrentControlSet\Enum\IDE ein Schlüssel Security gefunden wird ( falls vorhanden ) und diesen löscht.
Wenn dieser nicht vorhanden ist soll natürlich nix passieren.
Allerdings klappt es nicht. Ich habe auch schon einen Key erstellt und mit einem beliebigen Wert versehen, es wird nix gefunden.
Weiß jemand woran das liegt?
Hier das Skript.
Lg
Heiko
Function DeleteRegProperty
{
param
(
$RegPath,
$ValueName,
[switch]$WhatIf
)
$RemovalArray = @()
New-PSDrive -Name HKLM1 -PSProvider Registry -Root Registry::HKEY_LOCAL_MACHINE -ErrorAction "SilentlyContinue" | Out-Null
Set-Location HKLM1:
$RegPathContent = Get-Item $RegPath
for ($i = 0 ; $i -lt $RegPathContent.ValueCount ; $i++)
{
$CurrentProperty = $RegPathContent.Property[$i]
if ($CurrentProperty -match $ValueName)
{
Write-Host "found match: $CurrentProperty"
$TempArray = @()
$TempArray = "" | Select KeyPath, PropertyName
[string]$TempArray.KeyPath = $RegPath
[string]$TempArray.PropertyName = $CurrentProperty
$RemovalArray += $TempArray
}
}
if ($RemovalArray.Count -gt 0)
{
foreach ($Item in $RemovalArray)
{
if ($WhatIf.IsPresent -eq $False)
{
Remove-ItemProperty $Item.KeyPath $Item.PropertyName
}
else
{
Write-Host "Would Remove Here: $($Item.KeyPath) $($Item.PropertyName)"
}
}
}
}
$RegPath = "HKLM:\SYSTEM\CurrentControlSet\Enum\IDE"
$ValueName = "Security"
DeleteRegProperty $RegPath $ValueName
[Edit Biber] Titel angepasst. Alt: "Hilfe - Möchte ein Registry Schlüssel finden und löschen". [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 296548
Url: https://administrator.de/contentid/296548
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
13 Kommentare
Neuester Kommentar
Weil die Funktion nur zum Löschen von Eigenschaften geeignet ist und nicht zum Löschen von ganzen Schlüsseln!
Wie der Funktionsname schon verlauten lässt DeleteRegProperty
fk
Wie der Funktionsname schon verlauten lässt DeleteRegProperty
fk
Weil die Funktion nur zum Löschen von Eigenschaften geeignet ist und nicht zum Löschen von ganzen Schlüsseln!
Korrekt, @pixel0815 siehe Zeile 51 - 54Siehe Remove-ItemProperty
Gruß, Sascha
Mit dem oben genannten Code kannst Du prüfen ob der Pfad zur Registry vorhanden ist inklusive Ausgabe deines Testwerts $RegPathContent.GetValue("Test") (wenn der Schlüssel auch so heißt).
Wenn Du dabei einen Rückgabewert erhälst, kannst Du mit Remove-ItemProperty löschen.
Anschließend passt Du es für dein Skript an.
Gruß, Sascha
Wenn Du dabei einen Rückgabewert erhälst, kannst Du mit Remove-ItemProperty löschen.
Anschließend passt Du es für dein Skript an.
Gruß, Sascha
Wozu eine so umständliche und fehlerbehaftete Funktion nehmen wenn du doch direkt schreiben kannst
Wenn man einen Schlüssel löschen will nimmt man remove-item anstatt Remove-Itemproperty.
Wie ein Dateisystem hat die Registry Ordner (Schlüssel) und Eigenschaften(Werte), die man differenzieren muss.
$key= "HKLM:\Software\XYZ
$property = 'testwert'
Remove-ItemProperty -path $key -Name $property -Force -EA Ignore
Wenn man einen Schlüssel löschen will nimmt man remove-item anstatt Remove-Itemproperty.
Wie ein Dateisystem hat die Registry Ordner (Schlüssel) und Eigenschaften(Werte), die man differenzieren muss.
Hallo pixel,
schau Mal hier Get-Childitem
Hier ist ein Beispiel:
Gruß, Sascha
schau Mal hier Get-Childitem
Hier ist ein Beispiel:
$RegPathContent= Get-ChildItem -r $RegPath | Where-Object {$_.GetValue($property)}
IF ($RegistryPath -eq $null){
Write-Host "Exception Message: Kein Registry Eintrag gefunden"
} ELSE {
Write-Host "Registry Eintrag gefunden"
Remove-ItemProperty -Path $RegistryPath.pspath -Name $property -Force -EA Ignore
}
Hallo Heiko,
ich benutze dafür meine Universal-Funktion find-regkey die sowohl nach Werten als auch Schlüsseln suchen und sie auch löschen kann:
(Beispiele für die Verwendung finden sich in den Examples im Header.)
Grüße Uwe
ich benutze dafür meine Universal-Funktion find-regkey die sowohl nach Werten als auch Schlüsseln suchen und sie auch löschen kann:
(Beispiele für die Verwendung finden sich in den Examples im Header.)
function find-regkey{
[cmdletbinding()]
<#
.SYNOPSIS
Sucht Registry Werte und Schlüssel und führt bei Bedarf Aktionen mit diesen aus
.DESCRIPTION
Durchsucht einen Pfad der Registrierung nach bestimmten Schlüsseln oder Eigenschaften und dessen Werten.
Bei Bedarf kann dann gleichzeitig eine Aktion auf diese ausgeführt werden.
.EXAMPLE
find-regkey -regpath "HKCU:\Software\Microsoft\Windows" -KeyValue "CurrentVersion"
Variante 1: Suche nach einem Schlüssel (nicht rekursiv) in einem Registry-Pfad
.EXAMPLE
find-regkey -regpath "HKCU:\Software\Microsoft\Windows" -KeyValue "CurrentVersion" -recurse -KeyAction DeleteKey
Variante 2: Suche nach einem Schlüssel und lösche die gefundenen Schlüssel sofort
.EXAMPLE
find-regkey -regpath "HKLM:\Software\Microsoft\CurrentVersion\Explorer" -property "Demo*" -recurse
Variante 3: Suche rekursiv nach einer Eigenschaft mit einem bestimmten Namen (mit Wildcards)
.PARAMETER regpath
Der Registry-Pfad
.PARAMETER property
Die Eigenschaft nach der gesucht wird
.PARAMETER KeyValue
Der Schlüsselname nach dem gesucht wird (Wildcards erlaubt)
.PARAMETER PropertyAction
Eine Aktion die auf die gefundenen Eigenschaften angewendet wird
- "DeleteProperty" = Löscht die Eigenschaft
.PARAMETER KeyAction
Eine Aktion die auf die gefundenen Schlüssel angewendet wird
- "DeleteKey" = Löscht den Schlüssel
#>
param(
[parameter(mandatory=$true,ParameterSetName="A")][parameter(mandatory=$true,ParameterSetName="B")][ValidateNotNullOrEmpty()][string]$regpath,
[parameter(mandatory=$false,ParameterSetName="B")][ValidateNotNullOrEmpty()][string]$property,
[parameter(mandatory=$false,ParameterSetName="A")][string]$KeyValue = "*",
[parameter(mandatory=$false,ParameterSetName="A")][ValidateSet("DeleteKey")][string]$KeyAction,
[parameter(mandatory=$false,ParameterSetName="B")][ValidateSet("DeleteProperty")][string]$PropertyAction,
[switch]$recurse
)
process{
switch($PSCmdlet.ParameterSetName){
"A"{
$all = Get-ChildItem $regpath -Recurse:$recurse.IsPresent -ErrorAction SilentlyContinue | ? PSChildName -like $KeyValue
if (!$all){
write-warning "Keine zutreffenen Elemente gefunden!"
return
}
switch($KeyAction){
"DeleteKey" {
$all | remove-item -Recurse -Force -verbose:$VerbosePreference
}
default {return $all}
}
}
"B" {
if($recurse.IsPresent){
$all = Get-ChildItem $regpath -Recurse:$recurse.IsPresent -ErrorAction SilentlyContinue | %{Get-ItemProperty $_.PSPath -Name $property -EA SilentlyContinue}
}else{
$all = Get-ItemProperty $regpath -Name $property -EA SilentlyContinue
}
if (!$all){
write-warning "Keine zutreffenen Elemente gefunden!"
return
}
switch($PropertyAction){
"DeleteProperty" {
$all | %{
Remove-ItemProperty -Path $_.PSPath -Name $property -Force -verbose:$VerbosePreference
}
}
default {return $all}
}
}
}
}
}
Hallo colinardo alias Uwe,
die Idee deines scripts ist super!
Leider funktioniert die Suche nach Properties mit Wildcards nicht...
Wenn du da nochmal gucken könntest...?
Hier der code den ich ausführen möchte:
Falls das zuviel meiner Wünsche ist, leider geht auch das nicht:
Grüße
Frank
die Idee deines scripts ist super!
Leider funktioniert die Suche nach Properties mit Wildcards nicht...
Wenn du da nochmal gucken könntest...?
Zitat von @colinardo:
Hallo Heiko,
ich benutze dafür meine Universal-Funktion find-regkey die sowohl nach Werten als auch Schlüsseln suchen und sie auch löschen kann:
(Beispiele für die Verwendung finden sich in den Examples im Header.)
Hallo Heiko,
ich benutze dafür meine Universal-Funktion find-regkey die sowohl nach Werten als auch Schlüsseln suchen und sie auch löschen kann:
(Beispiele für die Verwendung finden sich in den Examples im Header.)
function find-regkey{
<#
.SYNOPSIS
Sucht Registry Werte und Schlüssel und führt bei Bedarf Aktionen mit diesen aus
.DESCRIPTION
Durchsucht einen Pfad der Registrierung nach bestimmten Schlüsseln oder Eigenschaften und dessen Werten.
Bei Bedarf kann dann gleichzeitig eine Aktion auf diese ausgeführt werden.
...
find-regkey -regpath "HKLM:\Software\Microsoft\CurrentVersion\Explorer" -property "Demo*" -recurse
Variante 3: Suche rekursiv nach einer Eigenschaft mit einem bestimmten Wert (mit Wildcards)
Hier der code den ich ausführen möchte:
find-regkey -regpath "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" -property "{*}" -PropertyAction DeleteProperty
find-regkey -regpath "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" -property "{*" -PropertyAction DeleteProperty
Grüße
Frank