5 Replies Latest reply on Mar 8, 2016 9:06 AM by derniwi

    RegSearchFolder unter im 64-Bit-Pfad

    derniwi Master
      Hallo,

      unter 32 Bit komme ich mit dem Befehl klar.
      Unter x64 möchte ich im 64-Pfad der Registry suchen, aber das scheint nicht zu funktionieren.

      Ich weiß, dass der Befehl nicht offiziell unterstützt ist, brauche ihn aber...

      Hintergrund:
      Ich installiere in einem Paket eine Microsoft-Komponente (.msi), dafür habe ich dann auch die ProductID, mittels derer genau diese Version deinstalliert werden könnte. Leider gibt es aber auch Updates dafür, die allerdings in der neueren Version eine andere ProductID verwenden. Um zukünftge Updates ebenfalls zu erfassen, muss ich danach in der Registry suchen. Im Prinzip klappt das mit der 32-Bit-Variante auch sehr gut und auch sehr schnell. Bei x64 wird die Komponente aber im 64-Bit-Zweig hinterlegt (ist eben eine echte 64-Bit-Komponente). Hier kriege ich den Befehl nicht angepaßt, dass er dort sucht und etwas findet. Leider kann man den Befehl unter 2015.2.2 auch nicht per Doppelklick aufrufen, da kommen dann ein paar Fehlermeldungen: "Attempted an unsupported operation."
      Ein /x64 habe ich schon an den Befehl angehängt, leider erfolglos.

      Das Protokoll liefert folgende Informationen:
      10:01:24.462 2        ->  RegSearchFolder('HKEY_LOCAL_MACHINE\SOFTWARE','DisplayName','Microsoft Online Services Sign-in Assistant','0','pfad',rsfString+rsfChkFullPath,rsfString+rsfChkFullPath)/x64
      10:01:24.462 1         Disabled Wow64 file system redirection
      10:01:24.462 2          xniTools: searching for DisplayName ...
      10:01:51.622 2          xniTools: Registry name DisplayName not found.
      10:01:51.638 1         Reverted state of Wow64 file system redirection


      Suche ich nach einer 32-Bit-Anwendung, erhalte ich z.B. dies hier:
      10:07:03.306 2        ->  RegSearchFolder('HKEY_LOCAL_MACHINE\SOFTWARE','DisplayName','Java 8 Update 71','0','pfad',rsfString+rsfChkFullPath,rsfString+rsfChkFullPath)/x64
      10:07:03.306 1         Disabled Wow64 file system redirection
      10:07:03.306 2          xniTools: searching for DisplayName ...
      10:07:04.975 2          xniTools: Registry name DisplayName=Java 8 Update 71 in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83218071F0} found.
      10:07:04.975 2          xniTools: Parent index is 0
      10:07:04.975 1          xniTools: 0 subfolders removed
      10:07:04.991 2          xniTools: Setting local var pfad=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83218071F0}
      10:07:04.991 2          xniTools: Setting local var Tools.RegValue=Java 8 Update 71
      10:07:04.991 1         Reverted state of Wow64 file system redirection


      Und lasse ich die Wow64 Umleitung weg, erhalte ich dies:
      10:09:09.138 2        ->  RegSearchFolder('HKEY_LOCAL_MACHINE\SOFTWARE','DisplayName','Java 8 Update 71','0','pfad',rsfString+rsfChkFullPath,rsfString+rsfChkFullPath)
      10:09:09.138 2          xniTools: searching for DisplayName ...
      10:09:10.776 2          xniTools: Registry name DisplayName=Java 8 Update 71 in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83218071F0} found.
      10:09:10.776 2          xniTools: Parent index is 0
      10:09:10.776 1          xniTools: 0 subfolders removed
      10:09:10.776 2          xniTools: Setting local var pfad=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83218071F0}
      10:09:10.792 2          xniTools: Setting local var Tools.RegValue=Java 8 Update 71


      Ich würde im Normalfall auch nicht in der kompletten Registry suchen, sondern nur im entsprechenden Uninstall-Pfad. Aber wegen der Fehlersuche starte ich hier weiter oben.

      Ein Feature Request zur Unterstützung des Befehls RegSearchFolder und 64 Bit ist natürlich schon erstellt.

      Hat jemand noch eine Idee?

      Danke und Gruß
      Nils
        • 1. Re: RegSearchFolder unter im 64-Bit-Pfad
          malex_17 Apprentice
          Im Zweifelsfall würde ich es über die Powershell machen.

          Script per CallScript starten, dann können auch Variablen aus dem eScript übergeben werden.
          Würde mal sowas in der Richtung versuchen:

          Powershell-Script:
          # Variable _searchfor in eScript setzen, nach der wird im Wert "Displayname" gesucht (z.B. Java 7 Update 80)
          # Es wird im x86 und im x64 Zweig gesucht
          $searchfor = Get-NiVar "_searchfor"

          $return = (Get-ChildItem hklm:\Software\wow6432node\microsoft\windows\currentversion\uninstall | Get-ItemProperty | where {$_.displayname -match $searchfor }).PSpath | Convert-Path
          if(!$return){
          $return = (Get-ChildItem hklm:\Software\microsoft\windows\currentversion\uninstall | Get-ItemProperty | where {$_.displayname -match $searchfor }).PSpath | Convert-Path
          }

          Set-NiVar "_regpath" $return



          Escript:
          Set('_searchfor','Java 7 Update 80')
          Set('_regpath','')

          CallScript('.\Extern$\find_regpath.ps1','')/TS
          !
          If not %_regpath%=''
          ! Do something
          • 2. Re: RegSearchFolder unter im 64-Bit-Pfad
            derniwi Master
            Ja, per PowerShell / VBScript / cmd geht es auch.
            Nur finde ich den RegSearchFolder als internen Befehl recht nett und auch sehr schnell.
            Ich nutze ein CMD-Skript an anderer Stelle, welches im Prinzip das gleiche macht, aber das ist halt schon ein ganzes Stück langsamer. Und bei PS dauert es ja leider immer etwas, bis die Umgebung initialisiert ist.

            Wenn es nicht anders geht, werde ich wieder eine solche Lösung verwenden müssen. Aber wie gesagt, interne, schnelle Befehle sind mir meist lieber.

            Trotzdem Danke für die Antwort.
            Gruß
            Nils
            • 3. Re: RegSearchFolder unter im 64-Bit-Pfad
              derniwi Master
              Hallo,

              ich habe die beiden Skripte mal etwas überarbeitet.

              RegSearch.ps1:
              # In der Registry nach einer Variable und dem entsprechenden Inhalt suchen.
              # zu suchende Variable
              $searchForName  = Get-NiVar "_searchForName"

              # zu suchender Wert
              $searchforValue = Get-NiVar "_searchForValue"

              # zu durchsuchender Pfad
              $searchforPath = Get-NiVar "_searchForPath"

              $return = (Get-ChildItem $searchforPath | Get-ItemProperty | where {$_.$searchForName -match $searchForValue })
              if($return) {
              $return = $return.PSpath | Convert-Path
              if($return) {
                Set-NiVar "_regpath" $return
              }
              }


              Das eScript:
              Set('_regPath','')
              Set('_searchForName','DisplayName')
              Set('_searchForValue','Microsoft .NET Framework 4.6.1')
              Set('_searchForPath','HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall')
              CallScript('.\Extern$\RegSearch.ps1','')/x64/TS
              MsgBox
              Pfad: %_regpath%
              EndProc


              Das CallScript muss je nach dem, ob im 64-Bit- oder 32-Bit-Zweig gesucht werden soll,  markiert werden. Der Registry-Pfad bleibt dann eigentlich gleich.

              Und es wird nur direkt in den Schlüsseln unterhalb des angegebenen gesucht.

              Gruß
              Nils
              • 4. Re: RegSearchFolder unter im 64-Bit-Pfad
                malex_17 Apprentice

                Das CallScript muss je nach dem, ob im 64-Bit- oder 32-Bit-Zweig gesucht werden soll, markiert werden. Der Registry-Pfad bleibt dann eigentlich gleich.



                Das ist so nicht ganz richtig. Je nachdem ob CallScript mit oder ohne x64 aufgerufen wird wird entweder die 32-Bit oder die 64-Bit Variante der Powershell aufgerufen. (Sieht man recht schön in der ExecutionHostRPCserverRPC_AGG.log)
                Auf das Suchergebnis in der Registry hat das jedoch keinen Einfluss!
                • 5. Re: RegSearchFolder unter im 64-Bit-Pfad
                  derniwi Master
                  Genau das von Dir beschriebene habe ich eigentlich gemeint.
                  Entweder habe ich mich schlecht ausgedrückt oder Du mich nur falsch verstanden.

                  Aber ohne /x64 kann man nicht im 64-Bit-Zweig der Registry suchen.