Registry, alle SubKeys durchsuchen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Registry, alle SubKeys durchsuchen

    Hallo,
    Ich habe ein Problem mit dem Durchsuchen der Registry. Ich möchte den "InstalPath" von "World of Warcraft" herausfinden. Er befindet sich in den Unterordnern "Blizzard Entertaiment\World of Warcraft", aber die Überordner sind nicht bekannt, weil das für einen Launcher ist und die Standorte dieser Ordner in der Registry auf verschiedenen Computern variieren.
    Gibt es eine Möglichkeit die Registry so zu durchsuchen, dass ich den "InstallPath" herausfinde, obwohl nur die letzten beiden Unterordner bekannt sind?

    Mit freundlichen Grüßen,
    Dark_Playmo

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dark_Playmo“ ()

    Willkommen im Forum. :thumbup:
    Sieh Dir die Registry / deren Inhalt immer zuerst mit RegEdit an, da weißt Du dann auch, welchen Schlüssel Du im Programm auslesen musst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Woher weis denn das Programm das auf InstallPath zugreift wo der Schlüssel liegt?
    Ansonsten kannst du dir mit

    VB.NET-Quellcode

    1. Registry.ClassesRoot.GetSubKeyNames
    2. Registry.CurrentUser.GetSubKeyNames
    3. Registry.CurrentConfig.GetSubKeyNames
    4. ...

    die Unterschlüssel der entsprechenden Hauptschlüssel ausgeben lassen und dann mittels Schleifen und Rekursion die ganze Registry nach dem entsprechenden Unterpfad durchsuchen.

    Hellmut schrieb:

    und dann mittels Schleifen und Rekursion die ganze Registry nach dem entsprechenden Unterpfad durchsuchen.
    Und was macht wer danach? :D :D :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Zu Antwort 1: Der SubKey "Blizzard Entertaiment" hat keine festen Haupschlüssel bzw. "Oberschlüssel". Dieser variiert nämlich von Computer zu Computer.

    Zu Antwort 2: Nachdem ich dann die Namen aller Unterschlüssel von (zB.) HKEY_LOCAL_MACHINE hab. Soll ich dann alle Namen wieder in die Schleife reinpacken, um dann zB. von SOFTWARE die Namen aller Unterschlüssel zu erhalten, um dann bei irgendeinem Unterschlüssel Blizzard Entertaiment zu finden?

    RodFromGermany schrieb:

    Und was macht wer danach? :D :D :D
    ???

    Dark_Playmo schrieb:

    Zu Antwort 2: Nachdem ich dann die Namen aller Unterschlüssel von (zB.) HKEY_LOCAL_MACHINE hab. Soll ich dann alle Namen wieder in die Schleife reinpacken, um dann zB. von SOFTWARE die Namen aller Unterschlüssel zu erhalten, um dann bei irgendeinem Unterschlüssel Blizzard Entertaiment zu finden?
    Ja, genau! Wobei du wahrscheinlich nicht ganz oben anfangen musst, sondern sicherlich das Verzeichnis weiter eingrenzen kannst.
    ich hab hier mal eine BreitenSuche aufgesetzt

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Imports System.Runtime.CompilerServices
    3. Public Class frmRegistrySearchBreathFirst
    4. Private _RootKey As RegistryKey = Registry.CurrentUser
    5. ''' <summary>
    6. ''' returnt den ersten RegistryKey, der einen SubKey mit dem im Pattern angegebenen Namen enthält
    7. ''' </summary>
    8. Private Function FindRegistryKey(ByVal regKey As RegistryKey, ByVal pattern As String) As RegistryKey
    9. Dim getChilds = Function(rk As RegistryKey) From s In rk.GetSubKeyNames Select New With {.rk = rk.OpenSubKey(s), .subKeyNames = .rk.GetSubKeyNames}
    10. Dim que = NewQueue(getChilds(regKey))
    11. Dim itm = que.Dequeue
    12. Do
    13. If itm.subKeyNames.Contains(pattern) Then
    14. que.ForEach(Sub(x) x.rk.Dispose())
    15. Return itm.rk
    16. End If
    17. getChilds(itm.rk).ForEach(AddressOf que.Enqueue)
    18. itm.rk.Dispose()
    19. itm = que.Dequeue
    20. Loop Until que.Count = 0
    21. Return Nothing
    22. End Function
    23. Private Sub frmRegistrySearchBreathFirst_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    24. Dim rk = Registry.CurrentUser
    25. grpDescription.Text = "Find SubKeyName in: " & _RootKey.ToString
    26. End Sub
    27. Private Sub btSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSearch.Click
    28. Dim rk = FindRegistryKey(_RootKey, txtPattern.Text)
    29. lbOutput.Text = rk.ToString
    30. End Sub
    31. End Class
    32. Public Module Helpers
    33. Public Function NewQueue(Of T)(ByVal Entries As IEnumerable(Of T)) As Queue(Of T)
    34. Return New Queue(Of T)(Entries)
    35. End Function
    36. <Extension()> _
    37. Public Sub ForEach(Of T)(ByVal Subj As IEnumerable(Of T), ByVal Action As Action(Of T))
    38. For Each itm In Subj
    39. Action(itm)
    40. Next
    41. End Sub
    42. End Module
    Dateien
    Danke für diesen hilfreichen Quellcode. Er funktioniert auch gut solange ich CurrentUser durchsuche. Aber wenn ich einen anderen Hauptschlüssel durchsuche und dort nicht den 2. Subkey suche bekomme ich immer diesen Fehler: