Registry komplett auslesen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von rykoJLL.

    Registry komplett auslesen

    Hi,

    Ich würde gern die Registry komplett auslesen. Der Hintergrund ist der: ich möchte die Registry dahingehen überprüfen, welche Werte sich gegenüber dem Vortag geändert haben, d.h. die Registry in lesbarer Form abspeichern und diesen File mit dem File des Vortags abgleichen.

    Mit "GetValue" habe ich gesehen, wie man einzelne Werte auslesen kann. Ich brauch aber eine Routine, die mit der obersten Ebene beginnt, die Elemente ausliest und dann feststellt ob es sich um einen Wert oder einen Unterzweig handelt. Damit kann ich dann rekursiv zugreifen.

    Ist das machbar? Auch nach langem Suchen habe ich kein Beispiel gefunden, wo so etwas gemacht wird.

    LG
    Peter

    Peter329 schrieb:

    welche Werte sich gegenüber dem Vortag geändert haben
    Nutze dafür lieber einen Registry Spy (==> Frau Google).
    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!
    Ich hab mal ein ähnliches Projekt begonnen hab es nie fertig gestellt, da es recht lange dauert bis das so alles eingelesen ist. So hab ich die Struktur der Registry ausgelesen und in einer TreeView angezeigt, ohne Values.

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Imports System.Threading
    3. Public Class Form1
    4. Private Loading As Thread
    5. Private Delegate Sub PutIn(ByVal Node As TreeNode)
    6. Private Delegate Sub Denied(ByVal Key As String)
    7. Private AccessDeniedList As String
    8. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    9. Loading = New Thread(AddressOf TV_Loading)
    10. Loading.Start()
    11. End Sub
    12. Private Sub TV_Loading()
    13. Dim R_KEY As RegistryKey = Registry.ClassesRoot
    14. Dim TV1_Node_CR As New TreeNode(R_KEY.Name)
    15. TV1_Node_CR = GetReg(R_KEY, TV1_Node_CR)
    16. Me.BeginInvoke(New PutIn(AddressOf AddNodes), TV1_Node_CR)
    17. R_KEY = Registry.CurrentUser
    18. Dim TV1_Node_CU As New TreeNode(R_KEY.Name)
    19. TV1_Node_CU = GetReg(R_KEY, TV1_Node_CU)
    20. Me.BeginInvoke(New PutIn(AddressOf AddNodes), TV1_Node_CU)
    21. R_KEY = Registry.LocalMachine
    22. Dim TV1_Node_LM As New TreeNode(R_KEY.Name)
    23. TV1_Node_LM = GetReg(R_KEY, TV1_Node_LM)
    24. Me.BeginInvoke(New PutIn(AddressOf AddNodes), TV1_Node_LM)
    25. R_KEY = Registry.Users
    26. Dim TV1_Node_U As New TreeNode(R_KEY.Name)
    27. TV1_Node_U = GetReg(R_KEY, TV1_Node_U)
    28. Me.BeginInvoke(New PutIn(AddressOf AddNodes), TV1_Node_U)
    29. R_KEY = Registry.CurrentConfig
    30. Dim TV1_Node_CC As New TreeNode(R_KEY.Name)
    31. TV1_Node_CC = GetReg(R_KEY, TV1_Node_CC)
    32. Me.BeginInvoke(New PutIn(AddressOf AddNodes), TV1_Node_CC)
    33. MessageBox.Show("Auf folgende konnte nicht zugegriffenwerden: " & Environment.NewLine & Environment.NewLine & AccessDeniedList)
    34. End Sub
    35. Private Sub AddNodes(ByVal Node As TreeNode)
    36. TreeView1.Nodes.Add(Node)
    37. End Sub
    38. Private Sub ADenied(ByVal s As String)
    39. AccessDeniedList += s & Environment.NewLine
    40. End Sub
    41. Private Function GetReg(ByVal Reg_Key As RegistryKey, ByVal Par_Node As TreeNode) As TreeNode
    42. For Each sKeyName As String In Reg_Key.GetSubKeyNames()
    43. Try
    44. Dim Sub_Key As RegistryKey = Reg_Key.OpenSubKey(sKeyName, CType(False, RegistryKeyPermissionCheck), Security.AccessControl.RegistryRights.ReadKey)
    45. Dim Ch_Node As New TreeNode(Sub_Key.Name)
    46. Ch_Node = GetReg(Sub_Key, Ch_Node)
    47. Par_Node.Nodes.Add(Ch_Node)
    48. Catch ex As Exception
    49. Me.BeginInvoke(New Denied(AddressOf ADenied), Reg_Key.ToString)
    50. End Try
    51. Next
    52. Return Par_Node
    53. End Function
    54. End Class
    Macht genau was du willst: Diffview

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rykoJLL“ ()

    Jau, Registry Comparer gibt es schon im Internet. Aber ich würde das ja gern als Autostart Programm im Hintergrund ausführen und einen Report erstellen. Da hab ich nix gefunden, womit man das erledigen könnte.

    Die Routine vom "Derfuhr" funktioniert soweit ... nun müsste ich halt noch die Daten extrahieren und das ist wohl ein bissl mühsam, weil so ein Schlüssel ja mehrere Werte enthalten kann und die in den verschiedensten Formaten angeliefert werden.

    Was mir noch unter die Finger gekommen ist: man kann die Registry in einen Text File exportieren: Da hat man dann eine lesbare Version der Registry ... aber die ist wegen des "geschwätzigen" Formats extrem aufgebläht. Außerdem wüsste ich auch nicht, wie man das automatisieren könnte.

    Da muss ich jetzt erst mal überlegen, welchen Weg ich weiter verfolge. Vielleicht wage ich mich an den Ansatz von "Derfuhr" ...

    Herzlichen Dank an alle Ratgeber!

    LG
    Peter
    @Peter329:

    Mir ist noch etwas einfacheres eingefallen. Regedit kann selbst die Registry exportieren, dann hast du .reg dateien die du vergleichen kannst. Machbar ist das mit Shell oder der Process-Klasse. Beispiel um HKCU zu exportieren.

    VB.NET-Quellcode

    1. Shell("cmd /c Regedit.exe /E ""C:\HKeyCurrentUser.reg"" ""HKEY_CURRENT_USER""")
    So ich hab oben mal den Link ausgebessert. Diffview kann auch einen Report erstellen und in den Autostart setzten kannste es ja selber.