Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1896 | Besucher online: 225
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Bestimmte Registry Keys oder Values überwachen


Autor: Tim Hartwig
Sprache: VB.NET
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 11165
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.


Abgelegt unter: Registry, WMI.



Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
''' <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
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Georg Riha schrieb am:  27.01.2011 08:01:49

Hallo
Ist es möglich das dieser Code nur unter HKEY_LOCAL_MACHINE funktioniert? Bei allen anderen bekomme ich Fehler.

Grüße Georg


Diese Snippets könnten für Sie interessant sein:
[C#] Using the Registry
[VB.NET] Einen Eintrag aus der Registy löschen
[VB.NET] Registryschlüssel löschen
[VB.NET] Einträge eines Registryschlüssels Enumerieren
[VB.NET] Anzahl der Einträge eines Registryschlüssels ermitteln
[C#] Liefert alle Assemblies aus dem Global Assembly Cache (GAC)
[C#] UserID des aktuellen Benutzers ermitteln
[VB.NET] Nützliches aus der Registry
[C#] Add/Remove registry entries for windows startup.
[VB.NET] Audio und Video Codecs auflisten
[C#] OpenSubKey mit Create
[C#] Windows CD Key auslesen
[VB.NET] Autostart with windows Property
[C#] Registery Nach einem Value durchsuchen
[VB.NET] Autostarteintrag schreiben
[C#] Betriebssystem mit WMI auslesen
[VB.NET] WMI Hardware Wrapper
[VB.NET] Installierte Programme und Hotfixes per WMI abfragen
[VB.NET] OS Informationen
[VB.NET] Anwendung deinstallieren
[C#] WMI Getter
[C#] Anzahl logischer Prozessoren ermitteln
[C#] Anzahl physikalischer Prozessoren ermitteln
[VB.NET] Alle Codecs OHNE Registry Zugriff
[VB.NET] Alle Codecs eines REMOTE Systems mit WMI
[C#] Ermittelt Remote, ob der User Admin, PowerUser oder User -Re
[C#] Ermittelt alle Gruppenmitgliedschaften eines Users auf einem
[C#] Druckaufträge mit WMI auslesen
[C#] Freigaben eines RemoteRechners auslesen/ löschen
[C#] Seriennummer eines Laufwerkes auslesen mit WMI
[VB.NET] Seriennummer eines Laufwerkes auslesen mit WMI
[VB.NET] Systemdirectory eines Remotesystems mit WMI ermitteln
[VB.NET] Betriebssystemarchitektur ermitteln per WMI
[VB.NET] Betriebssystem ermitteln per WMI
[VB.NET] Bildschirmaktualisierungsrate ermitten
[VB.NET] Angemeldeter User
[VB.NET] Uptime eines Computers ermitteln
[VB.NET] Ermitteln des Ländercodes per WMI
[VB.NET] Ermitteln der Zeitzone per WMI
[VB.NET] Modelltyp des Rechners per WMI ermitteln
[VB.NET] Hersteller ermitteln per WMI
[VB.NET] Installierte Drucker ermitteln

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.