Registry-Zugriff?

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Pidgin.

    Registry-Zugriff?

    Hallo Leute!

    Ich habe heute mit einem neuen Projekt begonnen, jedoch scheitere ich daran, wie ich Registry-Keys lesen und schreiben kann. Ich glaube mir fehlt die Berechtigung dazu oder so..

    Ich probierte folgendes:


    VB.NET-Quellcode

    1. Dim readValue As String
    2. readValue = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\Software\phy6", "Storage", Nothing)
    3. MsgBox(readValue)


    Allerdings bekomme ich dann bei der MsgBox nur System.Byte[]

    Bitte daher um Hilfe! ;)
    Ich würde das so machen:

    VB.NET-Quellcode

    1. Dim regkey As RegistryKey = Registry.LocalMachine.CreateSubKey("DeinPfad")
    2. Dim b As String
    3. My.Computer.Registry.LocalMachine.CreateSubKey("DeinPfad").SetValue("Name", "Wert")
    4. b = regkey.GetValue("Name")
    5. MsgBox(b)

    Ich weiß nicht, ob das jetzt richtig ist. Ich habe es "freihand" gemacht.
    Um auf LocalMachine zugreifen zu können, brauchst du garantiert Admin-Rechte. Diese verschaffst du dir, indem du VB einfach mit Administratorrechten startest/das Programm mit Admin-Rechten startest.
    Mit freundlichsten Grüßen

    Leon36910


    Bombensichere Testversion: 12%
    Okay, nun bekomme ich bei

    b = regkey.GetValue("Storage")

    einen Fehler:


    Wenn ich dort nun wieder schreibe b = Convert.ToString(regkey.GetValue("Storage"))

    Erhalte ich nur System.Byte[] in der MSGbox, was mich wieder zum eigentlichen Problem bringt!
    Ziemlich falsches Parameter. Streich mal das "HKEY_LOCAL_MACHINE" in Dim regkey As RegistryKey = Registry.LocalMachine.CreateSubKey("...")
    Schreibe einfach Dim regkey As RegistryKey = Registry.LocalMachine.CreateSubKey("DeinPfad") ohne dieses "HKEY_LOCAL_MACHINE" davor.

    Zur zweiten Fehlermeldung: Irgendwo musst du .ToString hinterschreiben. Ich schätze mal, dass du deinen Code nicht Posten willst oder?
    Mit freundlichsten Grüßen

    Leon36910


    Bombensichere Testversion: 12%
    Hi
    Create... erzeugt einen Registrierungseintrag. Warum einen erzeugen? OpenSubKey gibt NULL zurück, wenn es keinen gibt.
    Und es ist nicht sinnvoll, einen Screenshot in Übergröße hochzuladen, wenn man auch die Fehlermeldung einfach reinkopieren könnte. ;) Auf dem Screenshot ist nicht mehr zu erkennen, als wenn du die Fehlermeldung reinkopierst, eher weniger.
    Registrierungseinträge sind nicht zwangsweise Strings. Das was du zurückkriegst ist vmtl. ein Byte-Array. Ich geh' mal davon aus, dass es im My-Namensraum nicht als String gelöst wurde und empfehle die Verwendung von Option Strict On. Ein Byte-Array ist nämlich kein String und muss erst entsprechend dargestellt werden.

    Gruß
    ~blaze~

    VB.NET-Quellcode

    1. Dim regkey As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Test")
    2. My.Computer.Registry.LocalMachine.CreateSubKey("Software\Microsoft\Test").SetValue("Name", "Wert")
    3. MsgBox(regkey.GetValue("DeinSchlüssel"))
    Mit freundlichsten Grüßen

    Leon36910


    Bombensichere Testversion: 12%

    Leon36910 schrieb:

    Ziemlich falsches Parameter. Streich mal das "HKEY_LOCAL_MACHINE" in Dim regkey As RegistryKey = Registry.LocalMachine.CreateSubKey("...")
    Schreibe einfach:Dim regkey As RegistryKey = Registry.LocalMachine.CreateSubKey("DeinPfad") ohne dieses "HKEY_LOCAL_MACHINE" davor.

    Zur zweiten Fehlermeldung: Irgendwo musst du .ToString hinterschreiben. Ich schätze mal, dass du deinen Code nicht Posten willst oder?

    Danke, auf diese lächerlichen Fehler meinerseits bin ich schon selbst gekommen ;)
    Ich kann meinen Code bzgl. dieses Problems posten:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Win32
    3. Public Class Form6
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim regkey As RegistryKey = Registry.LocalMachine.CreateSubKey(RegistryLocation)
    6. Dim b As String
    7. b = Convert.ToString(regkey.GetValue("Storage"))
    8. MsgBox(b)
    9. End Sub
    10. End Class


    ~blaze~ schrieb:

    Hi
    Create... erzeugt einen Registrierungseintrag. Warum einen erzeugen? OpenSubKey gibt NULL zurück, wenn es keinen gibt.
    Und es ist nicht sinnvoll, einen Screenshot in Übergröße hochzuladen, wenn man auch die Fehlermeldung einfach reinkopieren könnte. ;) Auf dem Screenshot ist nicht mehr zu erkennen, als wenn du die Fehlermeldung reinkopierst, eher weniger.
    Registrierungseinträge sind nicht zwangsweise Strings. Das was du zurückkriegst ist vmtl. ein Byte-Array. Ich geh' mal davon aus, dass es im My-Namensraum nicht als String gelöst wurde und empfehle die Verwendung von Option Strict On. Ein Byte-Array ist nämlich kein String und muss erst entsprechend dargestellt werden.

    Gruß
    ~blaze~


    Danke erstmal für das Feedback!
    Da ich nur ein Anfänger bin, frage ich dich, ob du eine Lösung dazu weißt, denn auch mit Option Strict on komme ich nicht weiter.
    Kommt wieder System.Byte[] raus.
    Wobei in der Theorie
    "b = regkey.GetValue("Storage").ToString"
    ja das gleiche wie
    "b = Convert.ToString(regkey.GetValue("Storage"))" ist oder?

    Übrigens besteht der "regkey" aus 15-mal 2er Kombination aus Buchstaben/Zahlen, getrennt durch Leerzeichen, falls das irgendjemandem weiter hilft.
    Beispiel: AA 11 22 33 44 B3 C5 B3 C1 N8 F3 44 AA 33 MN
    Das erste was du tun must ist ganz oben Option Strict On hinzuschreiben.
    Denn genau aus solchen Dingen resultieren deine Fehler.
    regkey.GetValue(...) ist eine Methode und eine solche Methode hat einen RückgabeTYP. Und nicht jeder Rückgabetyp ist ein String (auch wenn das manche meinen).
    In deinem Fall ist es ein ByteArray (Byte()).
    Um aus einem ByteArray einen String zu machen solltest du am besten die Encoding-Klasse verwenden:

    Wie das genau funktioniert kannst du hier nachlesen: msdn.microsoft.com/de-de/library/vstudio/744y86tc.aspx

    Als kleines Beispiel: Encoding.ASCII.GetString(regkey.GetValue(...))
    Welche Encodierung du brauchst musst du selbst herausfinden.

    Die ToString() Methode bei z.B. regkey.GetValue(...).ToString() besitzt jedes Objekt, da jedes Objekt ein System.Object ist. Und System.Object besitzt immer eine ToString Methode.
    Standartmäßig gibt das aber nur den "Klassennamen" zurück. Das heißt ein ByteArray wird nicht automatisch in einen String formatiert.

    @Leon36910 du bist dir sicher, dass das funktioniert?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    VB.NET-Quellcode

    1. Private Shared Sub Test()
    2. 'Schluessel oeffnen
    3. Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\VBExpress\10.0")
    4. If key IsNot Nothing Then 'falls vorhanden
    5. 'Wert mit Namen EditCfgData ermitteln, warum auch immer
    6. Dim value As Object = key.GetValue("EditCfgData")
    7. 'wenn der Wert ein Byte-Array ist
    8. If TypeOf value Is Byte() Then
    9. 'mach String drauss und gib aus
    10. MessageBox.Show(ByteArrayAsString(DirectCast(value, Byte())))
    11. Else
    12. MessageBox.Show("War kein Byte-Array.", "Warnung", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    13. End If
    14. Else
    15. MessageBox.Show("Kein VB10 installiert.", "Warnung", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    16. End If
    17. End Sub
    18. Private Shared Function ByteArrayAsString(ByVal bytes() As Byte) As String
    19. If bytes.Length > 0 Then
    20. 'Fuege einfach alle Bytes in Hexadezimaldarstellung und ein Leerzeichen
    21. Dim sb As New System.Text.StringBuilder(bytes.Length * 3)
    22. For Each bt As Byte In bytes
    23. sb.Append(Convert.ToString(bt, 16)).Append(" "c)
    24. Next
    25. Return sb.ToString(0, sb.Length - 1)
    26. Else
    27. Return String.Empty
    28. End If
    29. End Function

    So zum Beispiel. Die Konvertierung kannst du ja dann noch anpassen.

    Ahja, versuch auch zu verstehen, was wie wo passiert.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „~blaze~“ ()