Problem beim erstellen eines Registry-Key

  • VB.NET
  • .NET (FX) 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Krogjan.

    Problem beim erstellen eines Registry-Key

    Hallo,

    Ich habe ein Problem bei folgendem Code:

    VB.NET-Quellcode

    1. Dim MeinKey As Microsoft.Win32.RegistryKey
    2. MeinKey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey("Software\Wow6432Node\Codemasters\GRID", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)
    3. MeinKey.SetValue("LANGUAGE", "ger")


    Wenn ich das ausführe legt er das so ab: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Wow6432Node\Codemasters\GRID

    Wenn ich den Programmcode abändere:

    VB.NET-Quellcode

    1. [vbnet]
    2. Dim MeinKey As Microsoft.Win32.RegistryKey
    3. MeinKey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey("Software\Codemasters\GRID", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)
    4. MeinKey.SetValue("LANGUAGE", "ger")


    also ohne Wow6432Node legt er den Schlüssel trotzden noch in "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Codemasters\GRID" ab

    Wie kann ich einen Schlüssel direkt in SOFTWARE ablegen?
    Wisst ihr vielleicht warum er das so ablegt?

    Danke schonmal für eure Hilfe :)
    Schon das mal Probiert?

    VB.NET-Quellcode

    1. 'Erstellt einfachen Schlüssel
    2. My.Computer.Registry.CurrentUser.CreateSubKey("Key")
    3. 'Erstellt Schlüssel in Gruppe
    4. My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Codemasters\GRID",
    5. "WERT", "WERT")


    LG
    Ich habe das mal eben mit My.Computer.Registry.SetValue("Key", "Value-Name", "Value") getestet, und bei mir hat das tadellos funktioniert, hast du deine Registry auch mit 'F5' neu geladen?
    Funzt genauso gut mit Microsoft.Win32.Registry.LocalMachine.CreateSubKey("Software\Test-Key", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)

    Edit: Oh, tut mir Leid... habe das mit Current_User getestet, bei Local_Machine geht's tatsächlich nicht, auch nicht als Admin :/
    Hi,

    natürlich geht es mit beidem. Der Grund ist: Der My-Namespace wrappt nur das Zeugs und zwar ziemlich ranzig. -> Gleich das richtige nutzen und den My-Namespace außer Acht lassen.
    Und ja: Man braucht Adminrechte.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Win32
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim regKey As RegistryKey
    6. regKey = Registry.CurrentUser.CreateSubKey("Software\Microsoft\Windows\CurrentVersion\Internet Settings", RegistryKeyPermissionCheck.Default)
    7. regKey.SetValue("ProxyServer", "1", RegistryValueKind.String)
    8. regKey.Close()
    9. End Sub
    10. End Class
    11. '+ Admin Rechte


    Z.b:
    .SetValue("QuadWordValue", 42, RegistryValueKind.QWord)
    .SetValue("DWordValue", 42, RegistryValueKind.DWord)
    .SetValue("MultipleStringValue", New String() {"One", "Two", "Three"}, RegistryValueKind.MultiString)
    .SetValue("BinaryValue", New Byte() {10, 43, 44, 45, 14, 255}, RegistryValueKind.Binary)
    .SetValue("StringValue", "The path is %PATH%", RegistryValueKind.String)
    usw...

    LG Andre...

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

    ich habs jetzt nicht getestet, aber könnte so gehen.

    Generell ist vom Registry-Manipulieren abzuraten:
    1. manche Keys kannste garnet ändern
    2. man kann ein Windows damit instabil machen
    3. in jeder Windows-Version können die Schlüssel anders liegen, also was bei dir vlt. den gewünschten Effekt zeigt, mag ein anneres Windows destabilisieren
    4. Mehr Möglichkeiten hat man, wenn das Prog als Admin läuft - es ist aber ein prinzipielles Sicherheitsrisiko, den User zu zwingen, sich als Admin einzuloggen.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Win32
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. If Registry.LocalMachine.OpenSubKey("Hardware\Description\System\CentralProcessor\0").GetValue("Identifier").ToString.Contains("32") Then
    6. Dim regKey As RegistryKey
    7. regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    8. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    9. regKey.Close()
    10. ElseIf Registry.LocalMachine.OpenSubKey("Hardware\Description\System\CentralProcessor\0").GetValue("Identifier").ToString.Contains("64") Then
    11. Dim regKey As RegistryKey
    12. regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Wow6432Node\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    13. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    14. regKey.Close()
    15. Else
    16. ' KA
    17. End If
    18. End Sub
    19. End Class
    20. '+ Admin Rechte !!! GETESTET = GEHT 32 & 64 BIT !!!


    @ErfinderDesRades ( in jeder Windows-Version können die Schlüssel anders liegen ) = Ja kann sein .
    Pfad auf Existenz prüfen .

    If Key IsNot Nothing Then

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „TVX“ ()

    @Dksksm

    Warum wohl ??? !!!

    .GetValue("Identifier").ToString.Contains("32") Then

    .GetValue("Identifier").ToString.Contains("64") Then

    Weil es so gemacht ist das es erkennt ob du 64 oder 32 bit hast und es dann passend ablegt !


    Hier nur 32 Bit :

    VB.NET-Quellcode

    1. Dim regKey As RegistryKey
    2. regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    3. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    4. regKey.Close()


    Hier nur 64 Bit :

    VB.NET-Quellcode

    1. Dim regKey As RegistryKey
    2. regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Wow6432Node\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    3. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    4. regKey.Close()


    LG
    Bei folgendem Code:

    VB.NET-Quellcode

    1. Dim regKey As RegistryKey
    2. regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    3. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    4. regKey.Close()

    legt er den Schlüssel unter : "SOFTWARE\Wow6432Node\Codemasters\GRID" ab.
    Aber z.B. 64 Bit Anwendungen liegen doch einfach nur unter Software oder nicht?
    Wie kann ich den Schlüssel direkt in SOFTWARE ablegen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Krogjan“ ()

    Deine Antwort bedeutet, dass der von @Krogjan gepostete Code bei Dir den Eintrag in der Registry unter HKLM\SOFTWARE\Codemasters\GRID macht und das glaube ich nicht.
    Es geht darum, dass der Code bei einem 32-bit System tatsächlich den Eintrag wie gewünscht schreibt, der selbe Code auf einem 64-bit-System den Eintrag unter HKLM\SOFTWARE\Wow6432Node\Codemasters\GRID erstellt, obwohl das so gar nicht gewollt ist.

    Von daher macht der Code von Dir im Post #9 gezeigte Code zwar nichts falsch, aber auch keinen Sinn. Das selbe ergebnis erreichst du einfach mit dem Code von @Krogjan, also ein Code, der selbst nicht differenziert auf was für ein System er läuft.

    War das jetzt verständlich? Test den Code doch einfach mal auf deinen beiden Systemen. Es ist jedenfalls auf einem 64-bit-System mit deinem Code nicht möglich, einen Eintrsag unter HKLM\SOFTWARE\Codemasters\ zu erzeugen. Warum nicht ist die Frage, denn dort stehen ja zumindest auf meinen 3 64-bit-Systemen Einträge anderer Softwaren. Es muss also gehen dort Einträge zu erzeugen, dass wollen wir.

    TVX schrieb:



    Okay das sieht soweit sehr gut aus nur wo ist bei mir das Problem?
    Ich habe deinen Code in Windows 8.1 (64 bit) und 7 (64 bit) getestet und bei beiden hat er das falsch abgelegt.
    Die erstellten Test-Eintrage habe ich immer wieder gelöscht.
    Das eizige was mir auffällt, was anders ist, ist:

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim regKey As RegistryKey
    5. regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    6. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    7. regKey.Close()
    8. End Sub
    9. End Class


    Ich muss erst

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    schreiben damit die roten kringel um RegistryKey weg gehen.
    Sonst ist alles identisch.
    @Dksksm
    Das Video zeigt das ich w7 64 bit verwende - Siehe Anblick Systemsteuerung !

    Und ich erstelle den Schlüssel unter - "SOFTWARE\Codemasters\GRID" - und zwar nur dort !

    @Krogjan
    Imports Microsoft.Win32

    Schau mal Post 7 - 9 = OK 8|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TVX“ ()

    So hab euch en kleinen Test erstellt !
    Hiermit könnt ihr den Schlüssel ( Pfad ) beliebig unter 32 oder 64 bit erstellen + lesen + Pfad prüfen + löschen !!!

    Logischer weise ist wen ihr nen 32bit erstellt kein Eintrag unter 64 bit zu finden !
    Tut mir en gefallen und drückt zuerst löschen 64 & 32 bit um euere Reg-Leichen zu entfernen und Fehlausgaben zu vermeiden !
    VIEL SPAß ...


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Schlüßel_32bit_erstellen()
    2. Using regKey As RegistryKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    3. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    4. regKey.Close()
    5. End Using
    6. End Sub
    7. Private Sub Schlüßel_64bit_erstellen()
    8. Using regKey As RegistryKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Wow6432Node\Codemasters\GRID", RegistryKeyPermissionCheck.Default)
    9. regKey.SetValue("LANGUAGE", "ger", RegistryValueKind.String)
    10. regKey.Close()
    11. End Using
    12. End Sub
    13. Private Sub Schlüßel_lesen_32bit()
    14. Dim sregKey As String = ""
    15. Using regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Codemasters\GRID", False)
    16. If regKey IsNot Nothing Then
    17. sregKey = regKey.GetValue("LANGUAGE", False).ToString
    18. End If
    19. End Using
    20. MessageBox.Show(sregKey)
    21. End Sub
    22. Private Sub Schlüßel_lesen_64bit()
    23. Dim sregKey As String = ""
    24. Using regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Codemasters\GRID", False)
    25. If regKey IsNot Nothing Then
    26. sregKey = regKey.GetValue("LANGUAGE", False).ToString
    27. End If
    28. End Using
    29. MessageBox.Show(sregKey)
    30. End Sub
    31. Private Sub Schlüßel_Pfad_löschen_32bit()
    32. Using key As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE", True)
    33. key.DeleteSubKeyTree("Codemasters", False)
    34. key.Close()
    35. End Using
    36. End Sub
    37. Private Sub Schlüßel_Pfad_löschen_64bit()
    38. Using key As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node", True)
    39. key.DeleteSubKeyTree("Codemasters", False)
    40. key.Close()
    41. End Using
    42. End Sub
    43. Private Sub Pfade_32bit_prüfen()
    44. Using key32 As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Codemasters\GRID", False)
    45. If key32 IsNot Nothing Then
    46. MessageBox.Show("Der Pfad ( SOFTWARE\Codemasters\GRID ) wurde gefunden ! ", "Pfad gefunden !", MessageBoxButtons.OK, MessageBoxIcon.Information)
    47. Else
    48. MessageBox.Show("Der Pfad ( SOFTWARE\Codemasters\GRID ) wurde nicht gefunden ! ", "Pfad nicht gefunden !", MessageBoxButtons.OK, MessageBoxIcon.Error)
    49. End If
    50. End Using
    51. End Sub
    52. Private Sub Pfade_64bit_prüfen()
    53. Using key64 As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Codemasters\GRID", False)
    54. If key64 IsNot Nothing Then
    55. MessageBox.Show("Der Pfad ( SOFTWARE\Wow6432Node\Codemasters\GRID ) wurde gefunden ! ", "Pfad gefunden !", MessageBoxButtons.OK, MessageBoxIcon.Information)
    56. Else
    57. MessageBox.Show("Der Pfad ( SOFTWARE\Wow6432Node\Codemasters\GRID ) wurde nicht gefunden ! ", "Pfad nicht gefunden !", MessageBoxButtons.OK, MessageBoxIcon.Error)
    58. End If
    59. End Using
    60. End Sub


    Da - Versuch es :
    www48.zippyshare.com/v/76021687/file.html

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „TVX“ ()

    ErfinderDesRades: Unfreundlichkeit entfernt

    Ich habe selbstredend nicht vergessen die Registry immer sofort wieder zu säubern und zu aktualisieren.
    Ich habe dein Programm getestet, es funktioniert tatsächlich. Noch ist mir schleierhaft warum, denn der hier gezeigte Code funktioniert immer noch genau so wie ich es Dir versuchen zu erklären.
    Warum fordert deine EXE keine Adminrechte an? Das ist gefährlich!

    Ich habe Deine Funktionen sogar komplett nachgebaut und das auch mit ILSpy nachgeprüft. Die Funktionen, die Schaltflächen, alles ist genau so wie es hier steht und Du im Programm hast. Trotzdem findet sich in Deinem Programm noch mehr Code, den ich noch nicht kenne: Private Shared __ENCList As List(Of WeakReference) = New List(Of WeakReference)().
    Was ist das und was macht das? Ich habe zwar dazu etwas gefunden, aber nicht verstanden was das nun wirklich macht.

    Ich habe dennoch ein wenig weiter getestet, ohne dahinter zu kommen warum dein Programm funktioniert und meines mit dem selben Code, nicht. Nun legt mein Programm sogar ohne Adminrechte die geforderten Keys an, aber wie gehabt immer im Wow6432Node-Zweig, an. Nur nicht mehr unter HKLM\Software sondern unter
    Computer\HKEY_CLASSES_ROOT\WirtualStore\MACHINE\SOFTWARE\Wow6432Node\Codemasters

    Ich weiß nicht,leider immer noch nicht, was der eigentliche Trick ist, der Code allein funktioniert so wie hier ständig gezeigt jedenfalls nicht so flexibel, wie wir es wollen. Das Ergebnis ist immer:
    1. Es soll ein 32bit-Schlüsselangelegt werden, es wird aber ein 64bit-Pfad geschrieben.
    2. Der Test gibt an einen 32bit-Schlüssel gefunden zu haben, was nicht stimmt.
    3. Lösche 32bit-Schlüssel löscht den 64bit-Schlüssel.

    Ja mit Deinem Programm geht es wie Du behauptest, mit dem angeblich identischen Code (soweit ich es konnte mit ILSpy geprüft) klappt es hingegen nicht.
    Deine EXE ist übrigens 39,5 KB groß, mein angeblich identisches Programm nur 34,0 KB.
    Deine EXE funktioniert ohne explizit als Admin ausgeführt worden zu sein, meines bringt mir nur Zugriffsverletzungen, es sei denn ich starte es als Admin.
    Solange uns Du hier nicht Dein Projekt zeigst brauchen wir gar nicht erst weiterzumachen.

    Zum Überprüfen uns Testen habe ich das Projekt (ohne Müll) angehängt. Mein System ist ebenfalls Windows 7 Ultimate - 64 Bit.

    Nachtrag: Auf einem Notebook mit Windows 8.1 - 64 Bit (Vorinstalliertes Windows) funktioniert der Code auch aus meinem Projekt heraus wie er soll, allerdings auch nur wenn ich es mit Admin-Rechten starte (wie es sich gehört).
    Dateien
    • RegistryVB.zip

      (14,8 kB, 185 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()