Vermutlich zu blöd -- Registry (Prüfen ob Wert vorhanden)

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Vermutlich zu blöd -- Registry (Prüfen ob Wert vorhanden)

    Hi Ihr Lieben,

    ich sitze seit 4 Stunden an einem (wie ich dachte) simplen Problemchen.

    Ich möchte prüfen, ob in der Registry unter "Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"

    ein Eintrag mit Namen "LSH" existiert.

    Ich habe nun so ca 5 verschiedene Methoden gefunden und alle versucht,
    aktuellster Versuch:

    VB.NET-Quellcode

    1. Private Function KeyAvailable()
    2. Dim tmpBool As Boolean = False
    3. Using RegTyp32 As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) '32bit
    4. Dim Key32 As RegistryKey = RegTyp32.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    5. If Key32 IsNot Nothing Then
    6. ' MessageBox.Show(Key32.GetValue("LSH"))
    7. tmpBool = True
    8. End If
    9. End Using
    10. Return tmpBool
    11. End Function


    aber ich bekomme es einfach nicht zum laufen. Es handelt sich um einen StringWert in der Registry, mit dem Namen "LSH"

    Wenn dieser existiert, so soll schlicht true zurückkommen, andernfalls natürlich False


    Evtl. hatte ja bereits jemand vergleichbare Probleme und weiss des Rätsels Lösung.


    LG =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @asusdk Was kommt denn zurück?
    Kann es sein, dass Du dazu Admin-Rechte brauchst?
    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!
    Hi Rod,

    Adminrechte sind vorhanden VS wurde als Admin gestartet.

    Was den Rückgabewert angeht, verhält es sich am obigen Beispiel äußerst komisch.
    Wird es exakt so angewannt wie oben, erscheint immer nur eine leere MessageBox.

    Ändere ich z.B. : Dim Key32 As RegistryKey = RegTyp32.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) zu Dim Key32 As RegistryKey = RegTyp32.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run\LSH", True)

    verwende aber weiterhin : MessageBox.Show(Key32.GetValue("LSH")) so erscheint zuerst eine Leere Messagebox, und anschließend einmal eine mit dem Inhalt des Wertes. Ich kann mir beim besten willen nicht erklären weshalb...

    Registry Screenshot im Anhang
    Bilder
    • Capture.JPG

      54,95 kB, 1.011×213, 88 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @asusdk Ich hab hier ein Test-Snippet gefunden, das sieht so aus:

    VB.NET-Quellcode

    1. Dim keyName = "Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband"
    2. Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(keyName, True)
    3. If key.GetValue("Eintrag") Is Nothing Then
    4. Label1.Text = "Den Eintrag gibts nicht"
    5. Else
    6. Label1.Text = "Den Eintrag gibts"
    7. End If
    Musst Du nur Deine Daten einsetzen.
    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!
    Hi danke schon mal für die schnelle Hilfe =)

    leider bleibt das verhalten quasi unverändert (Screenshot)


    Kontext: wenn der Key vorhanden ist, so soll der Button (WPF) aktiv werden. Das Command funktioniert so einwandfrei. Nur kriegt er eben nicht das gewünschte ausgelesen. Irgendwie echt zum verzweifeln
    Bilder
    • Capture2.JPG

      181,65 kB, 1.825×745, 106 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    so soll der Button (WPF) aktiv werden.
    Ist das ein WPF-Problem?
    Bringt die Registry-Abfrage das richtige Ergebnis?
    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!
    Erst einmal ein paar Fragen.
    Ist dein Windows 32-bit oder 64-bit?
    Ist deine Applikation 32-bit oder 64-bit?

    Weil 32-bit Applikationen in 64-bit Windows greifen standardmässig auf den Knoten "HKLM\Software\Wow6432Node" zu.
    Um die 64-Bit-Version des Schlüssels zu lesen, muss man "RegistryView.Registry64" angeben.
    Win 10 enterprise 64 bit in diesem fall

    Er liesst eben leider gar nichts aus zum testen ja als messagebox versucht leider leer

    Registryview.registry64 versuch ich gleich mal sobald ich zuhause bin

    Schon mal danke :)

    Tippfehler bitte entschuldigen bin nich so der Handytipper
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Der Codeblock aus Post#1 ist mal Option Strict Off, da im Function-Kopf kein Rückgabetyp festgelegt ist. Die MessageBox-Zeile ist ebenfalls Off, da GetValue keinen String wiedergibt. Gut, sie ist auskommentiert, aber wehret den Anfängen. Ansonsten Registry64 - warum sollte man auf ner 64er Maschine auch Registry32 verwenden?

    VB.NET-Quellcode

    1. Private Function IsKeyAvailable() As Boolean
    2. Using RegTyp64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    3. Dim Key64 = RegTyp64.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    4. If Key64 IsNot Nothing Then Return Key64.GetValue("LSH") IsNot Nothing
    5. End Using
    6. Return False
    7. End Function

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    warum sollte man auf ner 64er Maschine auch Registry32 verwenden?


    hehe, ähm zugegeben wusste ich bis gestern nicht mal das es hier unterschiedliche registrys gibt ^^ da ich aufgrund von (Neu>Dword / Neu>Qword) davon ausging, das man einfach im Wert einstellt wie breit der Eintrag ist =)


    RegistryView.Registry64 war wohl der entprechende knackpunkt @HenryV und @VaporiZed´s Version mit dem Using block gefällt mir sehr gut =)

    Danke an euch alle =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    ... oder als Extension.

    VB.NET-Quellcode

    1. Public Module RegistryExtensions
    2. <Extension>
    3. Public Function Exists(ByVal _key As RegistryKey) As Boolean
    4. Return Not _key Is Nothing
    5. End Function
    6. <Extension>
    7. Public Function ValueExists(ByVal _key As RegistryKey, ByVal _value As String) As Boolean
    8. Return _key.GetValueNames.Contains(_value)
    9. End Function
    10. End Module