Hallo zusammen,
Ich wollte mir ein Programm zum abgleichen der Registry erstellen. Die Werte der Registry trage ich in eine Klasse ein. Doch beim inneren Instanzieren einer neuen SubkeyKlasse krachts.
Spoiler anzeigen
Genauer gesagt hier :
Ich kann ja den RegistryKey nicht neu Initalisieren. Zusätzlich ist dem defenetiv ein Object zugewiesen. Der Subpfad stimmt auch.
Wenn ich in der Regedit nachschaue sind dort keine Werte enthalten die ich auslesen könnte. Wenn ich jedoch überprüfe ob der ValueCount von dem Key > 0 ist, knallts auch.
Vielleicht liegt der Fehler auch gerade ganz wo anders. Aber die Werte sind alle Initialisiert und vorhanden.
LG
Ich wollte mir ein Programm zum abgleichen der Registry erstellen. Die Werte der Registry trage ich in eine Klasse ein. Doch beim inneren Instanzieren einer neuen SubkeyKlasse krachts.
VB.NET-Quellcode
- Imports Microsoft.Win32
- ''' <summary>
- ''' <code>Klasse mit allen SubKeys und Werten</code>
- ''' </summary>
- ''' <remarks></remarks>
- Public Class RegistryStammContainer
- Private SubContainer(0) As RegistrySubKey
- Public Sub New(ByVal hKey As RegistryKey)
- 'Erste SubKeys Öffnen
- For Each sbk As String In hKey.GetSubKeyNames()
- AddSubContainer(New RegistrySubKey(hKey.ToString & "\" & sbk & "\"))
- Next
- End Sub
- ''' <summary>
- ''' <code>Fügt einen SubKeyContainer in das Array ein.</code>
- ''' </summary>
- ''' <param name="container">Der Container der eingefügt werden soll.</param>
- ''' <remarks></remarks>
- Public Sub AddSubContainer(ByVal container As RegistrySubKey)
- ReDim Preserve SubContainer(SubContainer.Length)
- SubContainer(SubContainer.Length) = container
- End Sub
- End Class
- ''' <summary>
- ''' <code>Enthält die Subkeys und Werte</code>
- ''' </summary>
- ''' <remarks></remarks>
- Public Class RegistrySubKey
- Private hKey As RegistryKey
- Private subPfad As String
- Private RegistryValue(0) As RegistryValue
- Private RegistrySubKeys(0) As RegistrySubKey
- Public Sub New(ByVal CurrentPfad As String)
- 'Wird immer wieder aufgerufen. So dass alle Subkeys vorhanden sind
- 'Erst den Stammschlüsseln besorgen um die Subkeys auszulesen.
- 'Den Pfad vom Stammschlüssel trennen.
- With ParseString(CurrentPfad)
- hKey = .hKey
- subPfad = .SubPfad
- End With
- 'Eventuell vorhandene Valuebereiche einlesen
- For Each v As String In hKey.OpenSubKey(subPfad).GetValueNames()
- AddRegistryValue(CreateRegistryValue(v))
- Next
- 'Eventuell vorhandene Subkeys einlesen
- For Each s As String In hKey.OpenSubKey(subPfad).GetSubKeyNames
- Debug.WriteLine("Subkey wird erstellt : " & CurrentPfad & "\" & s & "\")
- AddSubContainer(CurrentPfad & "\" & s & "\") ' <- Überprüfen ob dass Format so stimmt
- Next
- End Sub
- ''' <summary>
- ''' <code>Löst den String in den Stammschlüssel und den SubPfad auf-</code>
- ''' </summary>
- ''' <param name="sValue">Der Pfad</param>
- ''' <returns></returns>
- ''' <remarks></remarks>
- Public Function ParseString(ByVal sValue As String) As RegParse
- If sValue.Contains(Registry.ClassesRoot.ToString) Then
- Dim rg As New RegParse With {.hKey = Registry.ClassesRoot, .SubPfad = sValue.Replace(Registry.ClassesRoot.ToString, "")}
- Return rg
- ElseIf sValue.Contains(Registry.CurrentConfig.ToString) Then
- Dim rg As New RegParse With {.hKey = Registry.CurrentConfig, .SubPfad = sValue.Replace(Registry.CurrentConfig.ToString, "")}
- Return rg
- ElseIf sValue.Contains(Registry.CurrentUser.ToString) Then
- Dim rg As New RegParse With {.hKey = Registry.CurrentUser, .SubPfad = sValue.Replace(Registry.CurrentUser.ToString, "")}
- Return rg
- ElseIf sValue.Contains(Registry.LocalMachine.ToString) Then
- Dim rg As New RegParse With {.hKey = Registry.LocalMachine, .SubPfad = sValue.Replace(Registry.LocalMachine.ToString, "")}
- Return rg
- ElseIf sValue.Contains(Registry.PerformanceData.ToString) Then
- Dim rg As New RegParse With {.hKey = Registry.PerformanceData, .SubPfad = sValue.Replace(Registry.PerformanceData.ToString, "")}
- Return rg
- ElseIf sValue.Contains(Registry.Users.ToString) Then
- Dim rg As New RegParse With {.hKey = Registry.Users, .SubPfad = sValue.Replace(Registry.Users.ToString, "")}
- Return rg
- Else
- Throw New Exception("Konnte den Pfad : " & sValue & " nicht auflösen.")
- End If
- End Function
- ''' <summary>
- ''' <code>Erstellt eine neue Struktur für die RegistryValue</code>
- ''' </summary>
- ''' <param name="ValName">Der Name des Eintrags</param>
- ''' <returns></returns>
- ''' <remarks></remarks>
- Public Function CreateRegistryValue(ByVal ValName As String) As RegistryValue
- Return New RegistryValue With {.value = hKey.OpenSubKey(subPfad).GetValue(ValName), .valueKind = hKey.OpenSubKey(subPfad).GetValueKind(ValName)}
- End Function
- ''' <summary>
- ''' <code>Fügt einen neuen Registryeintrag in das Array ein.</code>
- ''' </summary>
- ''' <param name="Eintrag"></param>
- ''' <remarks></remarks>
- Public Sub AddRegistryValue(ByVal Eintrag As RegistryValue)
- ReDim Preserve RegistryValue(RegistryValue.Length)
- RegistryValue(RegistryValue.Length) = Eintrag
- End Sub
- ''' <summary>
- ''' <code>Erstellt einen neuen Subkey und fügt ihn in dass Array ein.</code>
- ''' </summary>
- ''' <param name="sPfad">Der Pfad für den Subkey.</param>
- ''' <remarks></remarks>
- Public Sub AddSubContainer(ByVal sPfad As String)
- ReDim Preserve RegistrySubKeys(RegistrySubKeys.Length)
- RegistrySubKeys(RegistrySubKeys.Length) = New RegistrySubKey(sPfad)
- End Sub
- End Class
- ''' <summary>
- ''' <code>Struktur zum speichern eines Eintrages in der Registry.</code>
- ''' </summary>
- ''' <remarks></remarks>
- Public Structure RegistryValue
- Public valueKind As RegistryValueKind
- Public value As Object
- End Structure
- ''' <summary>
- ''' <code>Struktur zum speichern des Pfades.</code>
- ''' </summary>
- ''' <remarks></remarks>
- Public Structure RegParse
- Public hKey As RegistryKey
- Public SubPfad As String
- End Structure
Genauer gesagt hier :
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Ich kann ja den RegistryKey nicht neu Initalisieren. Zusätzlich ist dem defenetiv ein Object zugewiesen. Der Subpfad stimmt auch.
Wenn ich in der Regedit nachschaue sind dort keine Werte enthalten die ich auslesen könnte. Wenn ich jedoch überprüfe ob der ValueCount von dem Key > 0 ist, knallts auch.
Vielleicht liegt der Fehler auch gerade ganz wo anders. Aber die Werte sind alle Initialisiert und vorhanden.
LG
NACHTRAG
Is ja schon peinlich
Lag daran gar nicht. Hab die Array falsch vergrößert. Jedoch hab ich jetzt wieder dass Problem dass ich gewisse schlüssel nicht öffnen darf.
Programm hat Administrator rechte. Kann ich dass ohne TryCatch abfragen?
Is ja schon peinlich
Lag daran gar nicht. Hab die Array falsch vergrößert. Jedoch hab ich jetzt wieder dass Problem dass ich gewisse schlüssel nicht öffnen darf.
Wieder die gleiche Stelle : Der angeforderte Registrierungszugriff ist unzulässig.
Programm hat Administrator rechte. Kann ich dass ohne TryCatch abfragen?
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Bagplatt“ ()