Benutzer mit den meisten Antworten
Registryabfrage über die OpenRemoteBaseKey-Methode Verarbeiten der Arrays

Frage
-
Hallo allerseits,
Ich will vorweg nehmen, ich bin ein Anfänger was PowerShell angeht und bilde mich so gut es geht selbst fort. Also entschuldigt auftretende Fehler meinerseits.
Folgendes Phänomen habe ich beim Abfragen der Registry nach Druckern eines Herstellers.
Ich durchsuche die Registry im Pfad System\CurrentControlSet\Enum\USB nach nach einer bestimmten VID/PID mittels GetSubKeyNames -like VID_xxx
Bis dahin alles kein Thema und ich erhalte 2 Einträge, welche ich auch zu 2 neuen Pfadangaben zusammensetze, um die darunter befindlichen Schlüssel anzeigen zu lassen. Dort erhalte ich jetzt aber 3 Einträge, welche ich nicht mehr so einfach mit den 2 obigen Pfaden zusammensetzen kann, um noch eine Stufe tiefer zu schauen. Das Ziel ist es also nach Hersteller und somit nach Seriennummern zu suchen und bei den gefundenen Einträgen zu schauen ob ein Unterschlüssel Control vorhanden ist.
Es ist sicherlich einfache Logik und hat sicher nur was mit dem Nutzen von Arrays zu tun, wie ich das kombinieren kann.
$computers = "RechnerName" $Serial=foreach($computer in $computers) { $SubKey= 'SYSTEM\CurrentControlSet\Services\usbprint\Enum' $SubKey1 = 'SYSTEM\CurrentControlSet\Enum\USB' $Value = '0' $Value1 = '1' $Value2 = '2' $RegField = 'LocalMachine' $RootType= [Microsoft.Win32.RegistryHive]::$RegField $RootKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($RootType,$Computer) $RegKey = if($RootKey.OpenSubKey($SubKey)-ne $Null){ $RootKey.OpenSubKey($SubKey)}else{$Null} #################################Bis hier Problemfrei#### $Arg1=$Rootkey.OpenSubKey($SubKey1).GetSubKeyNames() -like 'VID_04E8&PID_3???' $SubKey3=foreach($Finalpath in $Arg1){ ("$SubKey1\$Finalpath").ToString()} $SubKey3 #Ergebnis sieh wie folgt aus########################## #SYSTEM\CurrentControlSet\Enum\USB\VID_04E8&PID_3311 #SYSTEM\CurrentControlSet\Enum\USB\VID_04E8&PID_331D ################################################ $Arg2=foreach($FinalValue in $SubKey3){ $RootKey.OpenSubKey($FinalValue).GetSubKeyNames() -notlike '*&*'} $Arg2 ###Ergebnis sieht wie folgt aus################### Z5H9B8GD4F00A8Z ZDGRBJAD8000GNZ ZDGRBJBDC0017EY ################################################ #wie bekomme ich jetzt korrekt und richtig die Pfade #zusammengesetzt, denn die unteren beiden Seriennummern #sind aus der PID 331D und die obere Serial aus der PID #3311 oder wie würdet ihr das lösen, um jetzt unterhalb #der Serial nach dem Unterschlüssel Control zu schauen? #SYSTEM\CurrentControlSet\Enum\USB\VID_04E8&PID_3311#\Z5H9B#8GD4F00A8Z #Viell. sollte ich das ganze auch anders aufbauen? Ich bin #für alle Lösungen und Gedanken offen und dankbar.
Antworten
Alle Antworten
-
Du kannst nicht den Returnwert von foreach() nehmen sondern musst dies innerhalb der Schleife des foreach auflösen.
Alternativ kannst du auch $arg2 vorher ein Array zuweisen und innerhalb der Foreach das Ergebnis des OpenSubkey dem Array außerhalb der Schleife hinzufügen. Wobei GetSubKeyNames() ja ein Array zurückliefet, du dem $arg2 also ein Array als Element hinzufügst.
$arg2 = @()
foreach($FinalValue in $SubKey3){ $arg2 += $RootKey.OpenSubKey($FinalValue).GetSubKeyNames() -notlike '*&*'
}
- Bearbeitet Der Suchende Dienstag, 28. Mai 2019 07:32
-
erstmal vielen Dank für deine Antwort. Das klappt natürlich auch wie gewünscht. Ich erhalte mit deiner Abfrage ebenfalls die 3 Seriennummern.
Aber jetzt wird es ja erst spannend, wie ich nun dazu komme die Pfade korrekt zusammenzubauen, um schlussendlich also in Diesen nach dem Unterschlüssel Control zu suchen.
Ich könnte mittels deiner Hilfe jetzt folgendes tun:
$arg2 = @() foreach($FinalValue in $SubKey3[0]){ $arg2 += $RootKey.OpenSubKey($FinalValue).GetSubKeyNames() -notlike '*&*' } $arg2 #Ergebnis = korrekt: #Z5H9B8GD4F00A8Z - die richtige Seriennummer zum Schlüssel $arg3 = @() foreach($FinalValue in $SubKey3[1]){ $arg3 += $RootKey.OpenSubKey($FinalValue).GetSubKeyNames() -notlike '*&*' } $arg3 #Ergebnis = korrekt: #ZDGRBJAD8000GNZ #ZDGRBJBDC0017EY - die richtigen Seriennummern zu Schlüssel
Ich habe jetzt, weil ich es in diesem Fall ja weiß, einfach nur in $SubKey3[0] bzw. [1] gesucht. Um zum SubKey3 die korrekte Seriennummer zu erhalten. Diesen SubKey3 muss ich jetzt als nächstes mit dem Ergebnis Arg2 bzw. 3 kombinieren damit ich einen neuen Unterschlüssel erhalte. Ziel ist dann also:
ich will prüfen in
SYSTEM\CurrentControlSet\Enum\USB\VID_04E8&PID_3311\Z5H9B8GD4F00A8Z - like 'Control'
Das geht sicherlich bestimmt einfacher zu realisieren, als ich es hier darstellen kann.
Evtl. hilft eine Funktion dabei die stets die gefundenen Werte zu einem neuen Schlüssel zusammenfügt oder sowas in der Art. Weil ich ja nie sagen kann, ob diese Konstellation auf einem anderen PC sich genauso darstellt. Ich muss das ganze ja noch in If-Schleifen packen, um 0-Werte zu vermeiden. Ich bin da derzeit ratlos und hoffe du weißt grundsätzlich was ich erreichen will damit? Nur der Eintrag, der auch das Feld 'Control' als Unterschlüssel beinhaltet, der ist auch tatsächlich am PC vorhanden. Dann darf die Seriennummer als true zurückgegeben werden. So soll es am Ende dann funktionieren.
-
Strings kann man einfach zusammenketten:
$A + $B ...
Dabei kann es zu Problemen führen, wenn beide Variablen Zahlen beinhalten, dies läßt sich aber mittels cast [string]$xx verhindern.
Somit kannst du nun deinen Schlüssel entsprechend zusammenbauen:
$Key = $root + "\" + $arg...
oder auch
...Subkey($Root + "\" + $arg...)...