none
registry key in einer 32 bit assembly aus HKLM\SOFTWARE entfernen RRS feed

  • Frage

  • Durch ein früheres Programm (kompiliert in VS 2010 mit AnyCPU) sind Einträge in HKLM\SOFTWARE erfolgt. Musste das Programm aus Kompatibilitätsgründen neu unter x86 kompilieren. Die Registry-Keys liegen jetzt im WOW6432. Beim Start meines Programms möchte ich jetzt bei allen Anwendern die Einträge unter HKLM\SOFTWARE löschen. Mein Aufruf

    Registry.LocalMachine.OpenSubKey("SOFTWARE\meinProg")

    wird aber umgeleitet (redirection) nach WOW6432 und der Aufruf Registry.LocalMachine.DeleteSubKeyTree("SOFTWARE\meinProg") entfernt den Schlüssel nicht, da ebenfalls im WOW6432 gesucht wird. Kann man das Problem in VB.Net lösen? Danke fütr eine Antwort.
    Samstag, 31. Mai 2014 13:36

Alle Antworten

  • Hallo,
    verstehe ich dich richtig:
    Du hattest dein Programm Anfangs als AnyCPU kompiliert und Einträge wurden unter WOW6432Node gespeichert.
    Nun ist dein Programm als x86 kompiliert und die Einträge aus SOFTWARE\mainProg sollen gelöscht werden?

    Wenn ja, musst du expliziet angeben, welcher Basisschlüssel geöffnet werden soll:

    RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\meinProg")
    Durch die Angabe der RegistryView wird der tatsächlich angegebene Ordner benutzt. Ich weiß nicht, wie es auf einem x86 System funktioniert. Prüfe darum ggf. mit der Environment.Is64BitOperatingSystem-Eigenschaft ob das Betreibssystem x86 ist und verändere entsprechend den Aufruf.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 31. Mai 2014 15:06
  • Danke für die schnelle Antwort. Für einen der Schlüssel-Pfade hatte ich HKLM\SOFTWARE angegeben. Auf den 64 Bit Rechnern unter WIN7 wurde das auch dort eingetragen. Bei meiner jetzigen x86-Kompilierung hat WIN7 mit demselben Code (Schreibe in HKLM\SOFTWARE) die Schlüssel unter WOW6432 eingetragen. Unter HKLM\SOFTWARE steht nun noch der "alte" Eintrag. Den hätte ich gern raus und ich kann die Anwender auch nicht dazu verdonnern, das mit der Hand zu machen. Wenn ich es mit mit meiner 32-Bit-Anwendung machen will, schlägt der Redirector zu und greift nicht auf den Zweig HKLM\SOFTWARE zu.

    Samstag, 31. Mai 2014 15:33
  • Hallo Norbert,

    Zum einen das ist WOW6432 ist richtig, denn alle 32-Bit Programme (x86) legen dort ihre Einträge ab. Die Umleitung wird automatisch von Windows übernommen, siehe

    Registry Keys Affected by WOW64

    Desweiteren: Der schreibende Zugriff auf HKEY_LOCAL_MACHINE erfordert administrative Rechte (spätestens ab Vista). Deswegen sollte man Änderungen nicht beim "normalen" Programmstart machen.

    Wenn Du ein Setup hast, könnte man es darüber machen. Eine Hilfslösung wäre eine Registry-Datei, die man mit administrativen Rechten ausführt, und die die Einträge löscht: How to add, modify, or delete registry subkeys and values by using a .reg file

    Gruß Elmar

    Samstag, 31. Mai 2014 15:39
  • Toll, wie man hier so schnell kompetente Antworten bekommt! Danke!

    @Elmar: Natürlich prüfe ich ab, ob der falsche Eintrag noch drin steckt. Wenn nicht, dann passiert nix. Wenn doch, wird geprüft, ob der User Admin-Rechte hat. Dann sollen die falschen Einträge gelöscht werden. Ansonsten kommt eine MessageBox, dass er demnächst das Programm mal als Admin starten soll (rechte Maustaste - Ausführen als Administrator). Hab noch keine Nachteile bemerkt, wenn der Key (Installatoionspfad, Version, Publisher ...) sowohl in HKLM\SOFTWARE und zusätzlich in WOW6432 steht. Aber "sauber" ist das natürlich nicht.

    Ich glaube, die Lösung von Tom ist für mich genau die richtige. Bin noch am Testen. Wenn ich es nicht hinbekomme, versuche ich die anderen Lösungen.

    Grüße Norbert

    Samstag, 31. Mai 2014 15:54
  • Mit der oben gezeigten Codezeile wird HKLM\Software\meinProg so geöffnet als ob das Programm als 64 Bit Prozess laufen würde.
    Da unter Windows x86 egal ist ob das Programm als x86 oder AnyCPU läuft, brauchst du hier keine Änderung vornehmen. Lediglich unter Windows x64 musst du prüfen ob der Schlüssel noch existiert und ihn ggf. löschen. (Die Windows-Bit-Version kannst du mit der Environment.Is64BitOperatingSystem-Eigenschaft prüfen.)


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 31. Mai 2014 16:08
  • Gute Nachrichten von der Front: es funktioniert! Ich hoffe, dass ich es richtig gemacht habe. Bitte schaut nochmal drüber. Wie gesagt: das Ganze wird aus einem 32-Bit-Programm aufgerufen.

    regPfad = "SOFTWARE\DR_NO"
    If Environment.Is64BitOperatingSystem Then
        If RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(regPfad) IsNot Nothing Then
            RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).DeleteSubKeyTree(regPfad)
        End If
    Else
        If Registry.LocalMachine.OpenSubKey(regPfad) IsNot Nothing Then
            Registry.LocalMachine.DeleteSubKeyTree(regPfad)
        End If
    End If

    Hab bei meinem letzten Beitrag noch vergessen: wenn jemand keine Admin-Rechte hat, muss er natürlich den Admin rufen.

    Vielen Dank nochmal!

    Samstag, 31. Mai 2014 17:28
  • Für mich sieht dein Code richtig aus.

    Ich würde zwar eher ein Setup o.ä. bemühen (siehe Elmars Post), aber wenn die Lösung für dich ok ist - ich habe damit kein Problem.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 31. Mai 2014 19:32