none
Registry Wert überprüfen und auslesen RRS feed

  • 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

    Montag, 2. Oktober 2017 13:45

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
    Dienstag, 3. Oktober 2017 10:37
  • 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
    Mittwoch, 4. Oktober 2017 00:19

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
    Dienstag, 3. Oktober 2017 10:37

  • 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.name

    HKEY_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
    Dienstag, 3. Oktober 2017 12:33
  • punkt 2, habe ich noch gefunden

           Get-ItemPropertyValue$y.pspath -Name'001e660b'

    pspath wäre das Richtige gewesen.


    Chris

    Dienstag, 3. Oktober 2017 15:20
  • 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
    Mittwoch, 4. Oktober 2017 00:19
  • 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

    Mittwoch, 4. Oktober 2017 05:43
  • Darf man eine Where Pipe nicht einer Variable zuweisen. $x müsste eigentlich nur 001e660b liefern???

    Du darfst einer Variable zuweisen was auch immer Du möchtest und Dich weiterbringt. Das Beispiel von Dir filtert aber nicht auf den einzelnen Registry-Wert sondern auf den Schlüssel, in dem der Wert enthalten ist. Deshalb brauchst Du noch das Get-ItemPropertyValue hinten dran, um nur den einzelnen Wert zu erhalten, den Du suchst.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 4. Oktober 2017 19:36