Archiv für den Monat: September 2019

Registry-Suche per PowerShell – wieder einmal

Das Durchsuchen der Registry mit Get-ChildItem und Get-ChildItemProperty ist eigentlich nicht so schwer, wenn man sich ein paar Besonderheiten gewöhnt hat.

Die Anforderung ist schnell umschrieben. Eine Desktop-Anwendung werden sog. OCX-Controls. Das sind auf Dateien mit der Erweiterung .ocx basierende Programmkomponenten, die in der Registry enthalten sein müssen, damit sie von einer Anwendung verwendet werden können. Gesucht ist ein Befehl, der z.B. sämtliche Ocx-Controls auflistet. Eine kleine Herausforderung ergibt sich durch den Umstand, dass der Pfad der Ocx-Controls im (Default)-Eintrag eines Schlüssels abgelegt ist. Es gilt daher, diesen Eintrag anzusprechen (per „(Default)“, um es kurz zu machen;).

Der folgende Befehl listet alle Ocx-Einträge im Schlüssel Hkey_Local_Machine auf:

dir HKLM:\SOFTWARE\ -Recurse -ErrorAction Ignore |
 Get-ItemProperty -Name "(default)" -ErrorAction Ignore |
 Where-Object "(Default)" -like "*codejock*ocx" |
 Select-Object "(default)", PsPath

Etwas unschön ist natürlich der lange Pfad, der aus der PSPath-Eigenschaft resultiert. Mit einem Convert-Path lässt sich nur der relevante Teil abtrennen:

dir HKLM:\SOFTWARE\ -Recurse -ErrorAction Ignore |
 Get-ItemProperty -Name "(default)" -ErrorAction Ignore |
 Where-Object "(Default)" -like "*codejock*ocx" |
 Select-Object @{n="OcxPfad";e={$_."(default)"}},@{n="Regpfad";e={Convert-Path $_.PsPath}}

Eine naheliegende Erweiterung besteht natürlich daran, in einer weiteren Spalte anzugeben, ob die jeweilige Ocx-Datei auch existiert. Das lässt sich per Test-Path einfach feststellen.

dir HKLM:\SOFTWARE\ -Recurse -ErrorAction Ignore |
 Get-ItemProperty -Name "(default)" -ErrorAction Ignore |
 Where-Object "(Default)" -like "*codejock*ocx" |
 Select-Object @{n="Vorhanden";e={Test-Path $_.PsPath}}, @{n="OcxPfad";e={$_."(default)"}},@{n="Regpfad";e={Convert-Path $_.PsPath}}