Benutzer mit den meisten Antworten
Registry Wert überprüfen und auslesen

Frage
-
Hallo ihr Powershell Gurus,
leider habe ich seit ca. 3-4 Monaten nichts mehr mit Powershell gemacht, sodass die Registry und dortigen Objekte mein Vorstellungsvermögen übersteigern.
Ich möchte aus der Registry unter Outlook einen bestimmten Wert aber nur bei 001e660b auslesen.
ich poste euch einmal meinen SpagettiCode was ich schon probiert habe.
bei $RegOutlookKey habe ich ja eigentlich schon ein Objekt mit Name und Property (verwirrender Name unter Powershell)
D
Das Feld Property besteht aus einem Array.
jetzt müsste es ja trotzdem einfach möglich sein die Werte von Property auszulesen wenn das Property '001e660b' ist? siehe remarked Bereich. Mit einer zusätzlichen Unterschleife habe ich es zum Schluss getestet.
cls $RegOutlook = get-childitem 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook' #$RegOutlook foreach ($RegOutlookKey in $RegOutlook) { #$RegOutlookKey.Property foreach ($subkey in $RegOutlookKey.Property) { $x = Get-ItemPropertyValue $subkey -name '001e660b' $x } #Get-ItemPropertyValue $RegOutlookKey # if ($RegOutlookWert.Property -eq '001e660b') # { # Write-Host " treffer" -ForegroundColor Green #$RegOutlookWert.Property # foreach($y in $RegOutlookWert) # { # $y.GetValueNames() # } # $RegOutlookWert.Name, "-",$RegOutlookWert.PSChildName # } }
Chris
Antworten
-
Chrissi Chrissi Chrissi .... da hätte ich aber inzwischen mehr von Dir erwartet ... ;-)
Get-ChildItem -Path 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook' | Where-Object {$_.property -like '001e660b' } | Get-ItemPropertyValue -Name '001e660b'
BTW: Bitte keine Bilder posten - die sind sowieso meistens schwer zu erkennen. ... und Spagetti-Code zu posten finde ich auch sehr unhöflich. Wir müssen uns dann im Zweifel durch unnützen Code kämpfen, der nur aufhält. Und es würde Dir vielleicht auch helfen, Deinen Code besser zu verstehen, wenn er gut lesbar ist, anständig eingerückt ist und keine unnötigen Kommentare und Leerzeilen enthält.Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''- Als Antwort markiert -- Chris -- Dienstag, 3. Oktober 2017 12:33
-
Hmmm ... ich versuche das mal ... aber nach meiner Erfahrung, versteht das jeder irgendwie ein bissl auf seine eigene Art und Weise.
Die Powershell stellt die Registry annähernd wie ein Laufwerk zur Verfügung. Jedenfalls kann mann einige cmdlets benutzen, die für Dateisysteme gemacht sind, wie z.B. Get-ChildItem, New-Item usw..
Und die Powershell ist objektorientiert - also gilt hier ungefähr
Items = Objects = Registry-Schlüssel
und
ItemProperties = ObjectProperties = Registry-Werte
Mit ...
Get-ChildItem -Path 'HKCU:\....'
... ermittelst Du also alle "Unterordner" des angegebenen "Ordners". Du erhältst also alle Registry-Schlüssel unterhalb des angegebenen Schlüssels.
Mit ...
| Where-Object {$_.property -like '001e660b' }
... beschränkst Du die Ausgabe auf die Objekte (RegistrySchlüssel), bei denen in irgendeiner der ObjectProperties die angegebene Zeichenfolge auftaucht.
Und mit ...
| Get-ItemPropertyValue -Name '001e660b'
... gibst Du den Wert aus, der in der ObjectProperty gespeichert ist, deren Name '001e660b' ist.Und Punkt 2 hast Du ja schon selbst rausgefunden.
Übrigens: vorformatierter Code sieht hier im Forum meist auch nicht so gut aus. Die entsprechende Option (Code) im Editor ist dafür die beste Option. Genauso für Daten bei denen ein automatischer Zeilenumbruch auch eher hinderlich wäre, wie z.B. Logdatei-Auszüge oder Powershell Fehlermeldungen oder CSV-Datei-Auszüge.
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''- Bearbeitet BOfH-666 Mittwoch, 4. Oktober 2017 00:20
- Als Antwort markiert -- Chris -- Mittwoch, 4. Oktober 2017 05:04
Alle Antworten
-
Chrissi Chrissi Chrissi .... da hätte ich aber inzwischen mehr von Dir erwartet ... ;-)
Get-ChildItem -Path 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook' | Where-Object {$_.property -like '001e660b' } | Get-ItemPropertyValue -Name '001e660b'
BTW: Bitte keine Bilder posten - die sind sowieso meistens schwer zu erkennen. ... und Spagetti-Code zu posten finde ich auch sehr unhöflich. Wir müssen uns dann im Zweifel durch unnützen Code kämpfen, der nur aufhält. Und es würde Dir vielleicht auch helfen, Deinen Code besser zu verstehen, wenn er gut lesbar ist, anständig eingerückt ist und keine unnötigen Kommentare und Leerzeilen enthält.Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''- Als Antwort markiert -- Chris -- Dienstag, 3. Oktober 2017 12:33
-
thxs, Olaf,
cooler Tipp.das mit dem Code werde ich mir zu Herzen nehmen.
Kannst du uns das mit den Objekten anhand dieses Beispiels noch einmal näher erklären
1. Im Objekt x sind alle Einträge vorhanden Warum?Eigentlich sollte ja nur die gefilterten '001e660b' drinne sein?
2. wie müsste das dann in einer Schleife aussehen. y habe ich kontrolliert. Es beinhaltet alle Zeilen bzw. in unserem Beispiel die Nummern. Liegt es am Inhalt von y.nameHKEY_CURRENT_USER\Software... lt. Hilfe Beispiel HKCU: abgekürzt und Doppelpunkt
$x = Get-ChildItem -Path 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook' | Where-Object {$_.property -like '001e660b' } foreach ($y in $x) { Get-ItemPropertyValue $y.name -Name '001e660b' }
Chris
- Bearbeitet -- Chris -- Dienstag, 3. Oktober 2017 12:34
-
Hmmm ... ich versuche das mal ... aber nach meiner Erfahrung, versteht das jeder irgendwie ein bissl auf seine eigene Art und Weise.
Die Powershell stellt die Registry annähernd wie ein Laufwerk zur Verfügung. Jedenfalls kann mann einige cmdlets benutzen, die für Dateisysteme gemacht sind, wie z.B. Get-ChildItem, New-Item usw..
Und die Powershell ist objektorientiert - also gilt hier ungefähr
Items = Objects = Registry-Schlüssel
und
ItemProperties = ObjectProperties = Registry-Werte
Mit ...
Get-ChildItem -Path 'HKCU:\....'
... ermittelst Du also alle "Unterordner" des angegebenen "Ordners". Du erhältst also alle Registry-Schlüssel unterhalb des angegebenen Schlüssels.
Mit ...
| Where-Object {$_.property -like '001e660b' }
... beschränkst Du die Ausgabe auf die Objekte (RegistrySchlüssel), bei denen in irgendeiner der ObjectProperties die angegebene Zeichenfolge auftaucht.
Und mit ...
| Get-ItemPropertyValue -Name '001e660b'
... gibst Du den Wert aus, der in der ObjectProperty gespeichert ist, deren Name '001e660b' ist.Und Punkt 2 hast Du ja schon selbst rausgefunden.
Übrigens: vorformatierter Code sieht hier im Forum meist auch nicht so gut aus. Die entsprechende Option (Code) im Editor ist dafür die beste Option. Genauso für Daten bei denen ein automatischer Zeilenumbruch auch eher hinderlich wäre, wie z.B. Logdatei-Auszüge oder Powershell Fehlermeldungen oder CSV-Datei-Auszüge.
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''- Bearbeitet BOfH-666 Mittwoch, 4. Oktober 2017 00:20
- Als Antwort markiert -- Chris -- Mittwoch, 4. Oktober 2017 05:04
-
danke für die ausführliche Information.
Darf man eine Where Pipe nicht einer Variable zuweisen. $x müsste eigentlich nur 001e660b liefern???
hast du Office 2013? probiere das einmal
$x = Get-ChildItem -Path 'HKCU:\Software\Microsoft\Office\15.0\outlook\Profiles\outlook' | Where-Object {$_.property -like '001e660b' } $x
Chris
-
Darf man eine Where Pipe nicht einer Variable zuweisen. $x müsste eigentlich nur 001e660b liefern???
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''