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-ID: 296548

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

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

SaschaRD
SaschaRD 17.02.2016 aktualisiert um 14:36:31 Uhr
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
pixel0815
pixel0815 17.02.2016 um 14:55:10 Uhr
Goto Top
Warum funktioniert das obige Script nicht? Kann mir das jemand sagen?
126919
126919 17.02.2016 aktualisiert um 15:07:23 Uhr
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
SaschaRD
SaschaRD 17.02.2016 aktualisiert um 15:10:34 Uhr
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
pixel0815
pixel0815 17.02.2016 um 15:13:20 Uhr
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.
SaschaRD
SaschaRD 17.02.2016 aktualisiert um 15:22:57 Uhr
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
126919
126919 17.02.2016 aktualisiert um 15:32:51 Uhr
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.
pixel0815
pixel0815 17.02.2016 aktualisiert um 15:43:21 Uhr
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.
SaschaRD
SaschaRD 17.02.2016 aktualisiert um 16:28:03 Uhr
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
colinardo
Lösung colinardo 17.02.2016, aktualisiert am 21.02.2024 um 10:51:58 Uhr
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
fmosbk
fmosbk 21.02.2024 aktualisiert um 04:27:51 Uhr
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
colinardo
colinardo 21.02.2024 aktualisiert um 10:17:30 Uhr
Goto Top
Servus Frank.

Sorry, Fehler ist behoben.

Grüße Uwe
fmosbk
fmosbk 29.02.2024 um 10:11:05 Uhr
Goto Top
Danke, ich probiers die Tage mal aus...

Gruß
Frank