pixel0815
Goto Top

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

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]

Content-Key: 296548

Url: https://administrator.de/contentid/296548

Printed on: April 26, 2024 at 14:04 o'clock

Member: SaschaRD
SaschaRD Feb 17, 2016 updated at 13:36:31 (UTC)
Goto Top
Hallo pixel,
$RegPathContent = Get-Item $RegPath
	IF ($RegPathContent -eq $null){
		Write-Host "Exception Message: Kein Registry Eintrag für $RegPath gefunden"  
	} ELSE {
		Write-Host "Registry Eintrag für $RegPath gefunden"  
		$RegPathContent.GetValue("DEINWERT")  
	}

Gruß, Sascha
Member: pixel0815
pixel0815 Feb 17, 2016 at 13:55:10 (UTC)
Goto Top
Warum funktioniert das obige Script nicht? Kann mir das jemand sagen?
Mitglied: 126919
126919 Feb 17, 2016 updated at 14:07:23 (UTC)
Goto Top
Zitat von @pixel0815:

Warum funktioniert das obige Script nicht? Kann mir das jemand sagen?
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
Member: SaschaRD
SaschaRD Feb 17, 2016 updated at 14:10:34 (UTC)
Goto Top
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 - 54
Siehe Remove-ItemProperty

Gruß, Sascha
Member: pixel0815
pixel0815 Feb 17, 2016 at 14:13:20 (UTC)
Goto Top
Okay. Ich hab jetzt mal einen x-beliebigen Registry Schlüssel genommen, dort hab ich ein einfachen REG SZ Key erstellt, mit einem Wert "Test".
Selbst das klappt nicht. Also läuft das Script doch trotzdem nicht so richtig? Ich erhalte keine Write-Host Ausgaben wenn ich mit -whatif arbeite und löschen tut er auch nichts.
Member: SaschaRD
SaschaRD Feb 17, 2016 updated at 14:22:57 (UTC)
Goto Top
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
Mitglied: 126919
126919 Feb 17, 2016 updated at 14:32:51 (UTC)
Goto Top
Wozu eine so umständliche und fehlerbehaftete Funktion nehmen wenn du doch direkt schreiben kannst
$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.
Member: pixel0815
pixel0815 Feb 17, 2016 updated at 14:43:21 (UTC)
Goto Top
Das nehme ich auch. Es ist aber so das es recursiv alle Schlüssel durchsuchen muss.
Jetzt wird ja nur der Wert direkt beim $key genommen.

$key= "HKLM:\SYSTEM\CurrentControlSet\Enum\IDE"

Hier gibt ja verschiedene Schlüssel die je nach PC verschieden heißen.
Member: SaschaRD
SaschaRD Feb 17, 2016 updated at 15:28:03 (UTC)
Goto Top
Hallo pixel,

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		
}
Gruß, Sascha
Member: colinardo
Solution colinardo Feb 17, 2016, updated at Feb 21, 2024 at 09:51:58 (UTC)
Goto Top
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{
    [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}
                }
            }
        }
    }
}
Grüße Uwe
Member: fmosbk
fmosbk Feb 21, 2024 updated at 03:27:51 (UTC)
Goto Top
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...?


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.)

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  
Falls das zuviel meiner Wünsche ist, leider geht auch das nicht:
find-regkey -regpath "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" -property "{*" -PropertyAction DeleteProperty  


Grüße
Frank
Member: colinardo
colinardo Feb 21, 2024 updated at 09:17:30 (UTC)
Goto Top
Servus Frank.

Sorry, Fehler ist behoben.

Grüße Uwe
Member: fmosbk
fmosbk Feb 29, 2024 at 09:11:05 (UTC)
Goto Top
Danke, ich probiers die Tage mal aus...

Gruß
Frank