Feedback

VB - Bestimmte Registry Keys oder Values überwachen

Veröffentlicht von am 17.12.2006
(3 Bewertungen)
Diese Klasse überwacht veränderungen in der Registry entweder an einem Key oder an einem Wert.
Wenn man einen Key überwacht wird das Event immer dann ausgelöst wenn irgendetwas an diesem Key geändert wird wie z.B. es wird unter diesem Key ein neuer Key angelegt oder es wird ein Wert geändert.
Wenn man einen Wert überwacht wird das Event immer nur dann ausgelöst wenn auch genau dieser Wert verändert wird.
Snippet in C# übersetzen
''' <summary>
''' Diese Klasse überwacht Veränderungen in der Registry entweder an einem Key oder an einem Wert.
''' Wenn man einen Key überwacht wird das Event immer dann ausgelöst wenn irgendetwas an diesem Key geändert wird wie z.B. es wird unter diesem Key ein neuer Key angelegt oder es wird ein Wert geändert.
''' Wenn man einen Wert überwacht wird das Event immer nur dann ausgelöst wenn auch genau dieser Wert verändert wird.
''' </summary>
''' <remarks>Copyright © 2006 Tim Hartwig</remarks>
Public Class RegistryWatcher
    Public MonitorCollection As New Collections.Generic.Dictionary(Of String, Monitor)

    ''' <summary>
    ''' Diese Event wird ausgelöst wenn sich etwas bei einem überwachten Schlüssel oder Wert verändert
    ''' </summary>
    Public Event RegistryChanged(ByVal M As Monitor)

    Public Enum HKEY_ROOTS As Integer
        HKEY_CLASSES_ROOT = 0
        HKEY_CURRENT_USER = 1
        HKEY_LOCAL_MACHINE = 2
        HKEY_USERS = 3
        HKEY_CURRENT_CONFIG = 4
    End Enum

    ''' <summary>
    ''' Fügt einen Watcher hinzu um einen bestimmten Key oder Wert zu überwachen.
    ''' Wenn man nur einen Key überwachen will dann muss man den Parameter Value leer lassen.
    ''' Wenn man jedoch einen Wert überwachen will muss man den zu überwachenden Wert beim Parameter Value eintragen.
    ''' </summary>
    ''' <param name="Root">Das ROOT Verzeichnis der Registry.</param>
    ''' <param name="Path">Der Pfad der überwacht werden soll.</param>
    ''' <param name="ID">Eine benutzerdefinierte ID um den Watcher zu identifizieren.</param>
    ''' <param name="Value">Optional: Wenn man einen Wert überwachen will muss man den Namen des Werts hier eintragen aber nicht den Wert selber.</param>
    Public Sub AddWatcher(ByVal Root As HKEY_ROOTS, ByVal Path As String, ByVal ID As String, Optional ByVal Value As String = "")
        If MonitorCollection.ContainsKey(ID) = False Then
            Dim RegMon As New Monitor(Root, Path, ID, Value)
            AddHandler RegMon.Changed, AddressOf OnRegistryChanged
            MonitorCollection.Add(ID, RegMon)
        End If
    End Sub

    ''' <summary>
    ''' Deaktiviert und entfernt einen bestimmten Watcher.
    ''' </summary>
    ''' <param name="ID">Die ID des zu entfernenden Watchers</param>
    Public Sub RemoveWatcher(ByVal ID As String)
        If MonitorCollection.ContainsKey(ID) = True Then
            MonitorCollection(ID).StopWatch()
            MonitorCollection.Remove(ID)
        End If
    End Sub

    Private Sub OnRegistryChanged(ByVal M As Monitor)
        RaiseEvent RegistryChanged(M)
    End Sub


    Public Class Monitor
        Private mRoot As HKEY_ROOTS
        Private mPath As String
        Private mID As String
        Private mValue As String
        Private mStop As Boolean

        Public ReadOnly Property Root() As HKEY_ROOTS
            Get
                Return mRoot
            End Get
        End Property

        Public ReadOnly Property Path() As String
            Get
                Return mPath
            End Get
        End Property

        Public ReadOnly Property ID() As String
            Get
                Return mID
            End Get
        End Property

        Public ReadOnly Property Value() As String
            Get
                Return mValue
            End Get
        End Property

        Public Event Changed(ByVal M As Monitor)

        Sub New(ByVal NewRoot As HKEY_ROOTS, ByVal NewPath As String, ByVal NewID As String, ByVal NewValue As String)
            mRoot = NewRoot
            mPath = NewPath
            mID = NewID
            mValue = NewValue

            Dim T As New Threading.Thread(AddressOf Watcher)
            T.Start()
        End Sub

        Public Sub StopWatch()
            mStop = True
        End Sub

        Private Sub Watcher()
            Dim WMIObject As Object
            Dim WMIEvent As Object
            Dim WMICurrEvent As Object

            mPath = Replace(mPath, "\", "\\")

            'Aktuellen Computer überwachen
            WMIObject = GetObject("winmgmts:\\.\root\default")

            If mValue = "" Then
                'Kein Wert angegeben also nur den Key überwachen
                WMIEvent = WMIObject.ExecNotificationQuery( _
                    "SELECT * FROM RegistryKeyChangeEvent WHERE Hive='" & _
                    mRoot.ToString & "' AND " & "KeyPath='" & mPath & "'")
            Else
                'Es wurde ein Wert angegeben also wird genau dieser Wert überwacht
                WMIEvent = WMIObject.ExecNotificationQuery( _
                    "SELECT * FROM RegistryValueChangeEvent WHERE Hive='" & _
                    mRoot.ToString & "' AND " & "KeyPath='" & mPath & "' AND ValueName='" & mValue & "'")
            End If

            Do
                Try
                    'Für 500ms auf eine änderung warten danach wirft das Event eine Exception und es wird erneut gewartet.
                    'Wenn innerhalb dieser 500ms alledings eine änderung auftretet dann wird das Event der Klasse ausgelöst
                    If mStop = True Then
                        mStop = False
                        Exit Sub
                    End If
                    WMICurrEvent = WMIEvent.NextEvent(500)
                    RaiseEvent Changed(Me)
                Catch ex As Exception
                End Try
            Loop
        End Sub
    End Class
End Class
Abgelegt unter Registry, WMI.

1 Kommentare zum Snippet

Georg Riha schrieb am 27.01.2011:
Hallo
Ist es möglich das dieser Code nur unter HKEY_LOCAL_MACHINE funktioniert? Bei allen anderen bekomme ich Fehler.

Grüße Georg
 

Logge dich ein, um hier zu kommentieren!