Registry?

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Rikudo.

    Hey,

    Also so kann ich mir zum Beispiel alle Ordner unter LOCAL_MACHINE anzeigen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Public Class frm_main
    3. Private Sub frm_main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. End Sub
    5. Private Function getnodes(ByVal regkey As RegistryKey) As TreeNode
    6. Dim parts() As String = regkey.Name.Split("\")
    7. Dim temp As New TreeNode(parts.Last)
    8. Dim subkey As RegistryKey
    9. If regkey.SubKeyCount > 0 Then
    10. For Each keyName As String In regkey.GetSubKeyNames
    11. Try
    12. subkey = regkey.OpenSubKey(keyName)
    13. temp.Nodes.Add(getnodes(subkey))
    14. Catch ex As Exception
    15. End Try
    16. Next
    17. End If
    18. Return temp
    19. End Function
    20. Private Sub frm_main_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    21. regTree.Height = Me.Height - 60
    22. End Sub
    23. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    24. Dim rootnode As TreeNode
    25. rootnode = getnodes(My.Computer.Registry.LocalMachine)
    26. regTree.Nodes.Add(rootnode)
    27. End Sub
    28. End Class


    Das funktioniert auch. Das Problem aber ist, wenn ich z.B. LOCAL_MACHINE aufliste, dauert das 30-40 Sekunden.
    Wie kann ich das so umschreiben, das er nicht auf einmal die komplette Registry auslist, sondern immer nur jeweils den geöffneten Knoten?
    Und jedes mal wenn ich nen neuen Knoten öffne, die darin enthaltenen Subkeys?
    C# Developer
    Learning C++
    Ich habs mir mal angeschaut, aber ich weiß nicht wie ich es implementieren soll?
    Weil, iwie muss ich das ja im After_select event machen. Und wie sage ich ihm das er nicht alle, sonder nur die Subfolders des ausgewählten Pfades laden soll? :o
    C# Developer
    Learning C++
    Ist dieser Code überhaupt von dir? Mir scheint nämlich nicht, denn wärst du in der Lage, einen rekursiven Algorithmus zu schreiben, dann könntest du auch einen nicht-rekursiven schreiben.
    Du musst praktisch nur die Rekursion da raus nehmen. Wie man nur die direkten Unterknoten ausliest ist in dem Code bereits enthalten, das musst du nur rausfiltern. An welche Stelle du das dann einfügen musst sollte aus meinem Code dann hervorgehen.

    Rikudo schrieb:

    Ich habs mir mal angeschaut, aber ich weiß nicht wie ich es implementieren soll?
    Weil, iwie muss ich das ja im After_select event machen. Und wie sage ich ihm das er nicht alle, sonder nur die Subfolders des ausgewählten Pfades laden soll? :o

    Nein, der Code ist nicht von mir, ich weiss die Quelle aber nicht mehr, ichs vor langer Zeit mal gefunden.
    Das Problem liegt in diesem Part:

    VB.NET-Quellcode

    1. Private Function getnodes(ByRef regkey As RegistryKey) As TreeNode
    2. Dim parts() As String = regkey.Name.Split("\")
    3. Dim temp As New TreeNode(parts.Last)
    4. Dim subkey As RegistryKey
    5. If regkey.SubKeyCount > 0 Then
    6. For Each keyName As String In regkey.GetSubKeyNames
    7. Try
    8. subkey = regkey.OpenSubKey(keyName)
    9. temp.Nodes.Add(getnodes(subkey))
    10. Catch ex As Exception
    11. End Try
    12. Next
    13. End If
    14. Return temp
    15. End Function
    C# Developer
    Learning C++
    Du hast immer noch nicht verstanden, was ich dir mitteilen wollte.
    Dieser Code listet den kompletten Registrybaum auf, weil er rekursiv ist. Es liegt nun an dir, die nicht-rekursiven Teile herauszufiltern und ein eine neue Methode zu stecken. Es ist einfacher, als du vielleicht denkst, das meiste kannst du übernehmen.
    Ich verstehs auch nicht ganz, du sagst ja das ich das meiste übernehmen kann.
    Ich bastle mir da gerade was...

    VB.NET-Quellcode

    1. Sub GetRegInfo(ByVal RegistryFolder As Registry)
    2. Dim parts() As String = RegistryFolder.CurrentUser.Name.Split("\")
    3. Dim temp As New TreeNode(parts.Last)
    4. For Each SubKey As String In RegistryFolder.CurrentUser.Name.ToString
    5. temp.Nodes.Add(SubKey)
    6. Next
    7. End Sub

    Aber iwie geht das nicht, ich weiss nicht wie ich die Subkeys handeln soll
    C# Developer
    Learning C++
    Also, ich hab dir mal eine kleine Funktion geschrieben, die alle SubKeys eines RegistryKeys auflistet. Das sollte für dich reichen, um es hinzubekommen.

    VB.NET-Quellcode

    1. Private Function GetSubkeys(key As RegistryKey) As RegistryKey()
    2. Dim keys As New List(Of RegistryKey)
    3. For Each k In key.GetSubKeyNames
    4. keys.Add(key.OpenSubKey(k))
    5. Next
    6. Return keys.ToArray()
    7. End Function
    Du könntest diese auch in typisiertes Dataset schmeißen. Mehr infos dazu hier: openbook.galileocomputing.de/v…pisierte_datasets_001.htm


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke, das ist schonmal hilfreich. Also zuerst liste ich mal die HauptKeys in ner Combobox:

    VB.NET-Quellcode

    1. Private Function GetSubkeys(key As RegistryKey) As RegistryKey()
    2. Dim keys As New List(Of RegistryKey)
    3. For Each k In key.GetSubKeyNames
    4. keys.Add(key.OpenSubKey(k))
    5. regTree.Nodes.Add(k)
    6. Next
    7. Return keys.ToArray()
    8. End Function
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. regTree.Nodes.Clear()
    11. Dim HKCU As String = "HKEY_CURRENT_USER"
    12. Dim ROOT As String = "HKEY_CLASSES_ROOT"
    13. Dim HKU As String = "HKEY_USERS"
    14. Dim HKCC As String = "HKEY_CURRENT_CONFIG"
    15. Dim HKLM As String = "HKEY_LOCAL_MACHINE"
    16. If ComboBox1.SelectedItem.Contains(HKCU) Then
    17. GetSubkeys(Registry.CurrentUser)
    18. ElseIf ComboBox1.SelectedItem.Contains(ROOT) Then
    19. GetSubkeys(Registry.ClassesRoot)
    20. ElseIf ComboBox1.SelectedItem.Contains(HKU) Then
    21. GetSubkeys(Registry.Users)
    22. ElseIf ComboBox1.SelectedItem.Contains(HKCC) Then
    23. GetSubkeys(Registry.CurrentConfig)
    24. ElseIf ComboBox1.SelectedItem.Contains(HKLM) Then
    25. GetSubkeys(Registry.LocalMachine)
    26. End If
    27. End Sub
    28. End Class


    Jetzt fehlt nur noch der Part zum öffnen/laden der Subkeys aber nicht rekursiv, ich denke das krieg ich hin, wenn nicht, melde ich mich :P
    C# Developer
    Learning C++
    Mir schein, du willst mit TreeNode.Path die jeweiligen knoten befüllen. Glaub mir, das ist nicht die richtige Herangehensweise, ich habe nicht umsonst meine eigenen TreeNodes implementiert, die sich selbst verwalten und das Objekt, das sie darstellen, referenzieren. Nur das ist Objektorientiert und damit auch die einzig zulässige Möglichkeit.
    Schau mal, so viel Arbeit ist das eigentlich gar nicht, und es ist auch ganz einfach. Du brauchst lediglich meinen Code nehmen und statt Directories eben Registrykeys verwalten, mehr musst du nicht tun.

    Und nur mal nebenbei, die Lösung zu deinem Vorhabe könntest du innerhalb weniger Minuten finden, wenn du dir die Registry-Klasse auf MSND mal ansehen würdest.
    Ich würde trotzdem ganz gerne wissen wie ich das auflisten der Registry Ordner/Keys per String mache?
    Also wenn ich im Funktions-Paramter beispielsweise so etwas hinzugebe:

    Private function ListRegistry(ByVal Path as String) As ???

    Also das ich beim Aufruf das in etwas so machen kann:

    ListRegistry("HKEY_CURRENT_USER\Software\Adobe")

    Und mir dann diese Ordner aufgelistet werden:



    ?( ?(
    C# Developer
    Learning C++
    So müsste die Funktion aussehen, wenn du einen String angeben willst. Beachte aber, dass du den Registryhive nicht im Pfad angeben kannst, sondern ihn extra angeben musst.

    VB.NET-Quellcode

    1. Private Function GetSubkeys(hive As RegistryHive, path As String) As RegistryKey()
    2. Using key = RegistryKey.OpenBaseKey(hive, RegistryView.Default).OpenSubKey(path)
    3. Dim keys As New List(Of RegistryKey)
    4. For Each k In key.GetSubKeyNames
    5. keys.Add(key.OpenSubKey(k))
    6. Next
    7. Return keys.ToArray()
    8. End Using
    9. End Function
    Ich hab mittlerweile auch was zusammengebastelt, das funktioniert sogar:

    VB.NET-Quellcode

    1. Function ListSubKeys(path As String)
    2. Try
    3. path &= "\"
    4. Dim data = String.Empty
    5. Dim key As RegistryKey = Nothing
    6. Dim keypath As String() = path.Split("\")
    7. Select Case keypath(0)
    8. Case "HKEY_CURRENT_USER"
    9. key = Registry.CurrentUser.OpenSubKey(path.Replace("HKEY_CURRENT_USER\", String.Empty))
    10. Case "HKEY_USERS"
    11. key = Registry.Users.OpenSubKey(path.Replace("HKEY_USERS\", String.Empty))
    12. Case "HKEY_LOCAL_MACHINE"
    13. key = Registry.LocalMachine.OpenSubKey(path.Replace("HKEY_LOCAL_MACHINE\", String.Empty))
    14. Case "HKEY_CLASSES_ROOT"
    15. key = Registry.ClassesRoot.OpenSubKey(path.Replace("HKEY_CLASSES_ROOT\", String.Empty))
    16. Case "HKEY_CURRENT_CONFIG"
    17. key = Registry.CurrentConfig.OpenSubKey(path.Replace("HKEY_CURRENT_CONFIG\", String.Empty))
    18. Case Else
    19. key = Nothing
    20. End Select
    21. Dim keys As New List(Of RegistryKey)
    22. For Each k In key.GetSubKeyNames
    23. keys.Add(key.OpenSubKey(k))
    24. data &= k & vbNewLine
    25. Next
    26. Return data
    27. Catch
    28. Return String.Empty
    29. End Try
    30. End Function


    Allerdings verstehe ich nicht, wieso es mir bei HKLM nix anzeigt, selbst wenn ich es als Admin starte.
    Auslesen sollte normalerweise doch gehen?
    Bei allenen anderen Registryhives geht das problemlos.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ListBox1.Items.Clear()
    3. If File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Registry.txt") Then
    4. File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Registry.txt")
    5. End If
    6. On Error Resume Next
    7. For Each x In ListSubKeys(TextBox1.Text).ToString.Split(vbNewLine)
    8. ListBox1.Items.Add(x)
    9. File.AppendAllText(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Registry.txt", x.ToString & vbNewLine)
    10. Next
    11. MsgBox("Done!", MsgBoxStyle.Information)
    12. End Sub
    C# Developer
    Learning C++