none
Sind Registry Einträge untre HKEY_CURRENT_USER für alle Benutzer verfügbar? RRS feed

  • Frage

  • Guten Morgen,

    können Registry Einträge meiner Anwendung unter HKEY_CURRENT_USER\Software bei Lauf der Anwendung unter anderen eingeloggten Benutzern verwendet werden? Was ich meine ist: Einträge, welche unter der Verwendung der Anwendung von dieser geändert wurden, können diese beim Lauf der Anwendung bei anderen eingeloggten Benutzern ebenfalls gelesen oder geändert werden?

    Gruß
       Klaus.


    M. Thaddaeus

    Donnerstag, 15. Dezember 2016 09:02

Antworten

  • Hallo Klaus,

    gar nicht (ok, stimmt nicht, ist gelogen^^ Aber Du sollst gar nicht erst darüber nachdenken, weil das IMHO sinnfrei ist). Du kannst nicht auf jedem PC, auf dem deine Software laufen soll, Berechtigungen für Registryzweige ändern. Das macht auch keinerlei Sinn, da es viele Alternativen gibt, Du musst sie nur annehmen.

    HKLM kann von den Usern gelesen aber nicht geschrieben werden. Wenn Du also bspw. bei der Installation deiner Anwendung (mit Adminrechten) im HKLM Zweig bestimmte Schlüssel ablegst, können die zur Laufzeit (ohne Adminrechte) von allen Usern gelesen werden. Aber schreiben kannst Du dort eben ohne Adminrechte nicht.

    Wenn überhaupt, solltest Du es andersrum machen also bei den Usern dann ein Administratorlogin per UAC anfordern und die Registrywerte dann ändern.

    Es gibt aber auch noch Verzeichnisse, die man verwenden könnte. Komplexe Einstellungen sind in der Regel in der Registry nicht mehr so gut aufgehoben, da serialisiert man lieber in eine Datei. Je nach Speicherort kann die dann auch von allen Benutzer gelesen und geschrieben werden.

    Beschreib daher bitte genau, was Du wo aus welchem Grund in welcher Form speichern willst und warum Du die Registry unbedingt verwenden willst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:50
    Freitag, 16. Dezember 2016 08:25
  • Hallo Klaus,

    mit XML musst Du eigentlich gar nichts machen. Es geht hierbei nur um die Serialisierung und Deserialisierung deiner Settings.

    Mittels Serialisierung erzeugst Du aus einem einfachen oder auch sehr komplexen Objekt eine statische Abbildung der Eigenschaften des Objekts. Diese wiederum kann man bspw. in einer Datei, einer Datenbank, ... für eine spätere Wiederverwendung ablegen.

    Die Deserialisierung nimmt die statische Abbildung, erzeugt ein entsprechendes Objekt und füllt die Werte der gespeicherten Eigenschaften.

    Wenn Du also bspw. eine Klasse Settings mit den Eigenschaften BackgroundColor und ForegroundColor hast, könnte das in etwa so aussehen:

    [Serializable]
    public class Settings
    {
        public String BackgroundColor { get; set; }
        public String ForegroundColor { get; set; }
    
        public Settings()
        {
            this.BackgroundColor = "#FFFFFF";
            this.ForegroundColor = "#000000";
        }
    }

    Mittels Serialisierung speicherst Du die Instanz deiner Settings Klasse in eine XML Datei (andere Formate gehen natürlich auch) und beim nächsten Programmstart liest Du sie eben wieder aus.

    Mit XML an sich musst Du dich hierfür gar nicht beschäftigen.

    ---

    Die eigentliche Frage ist ja aber nun doch ausreichend beantwortet, daher würde ich vorschlagen, die weiteren Fragen in einem neuen Thread zu behandeln. Diesen hier könntest Du bitte abschließen, in dem Du die hilfreichsten Antworten bewertest und ggfs. "als Antwort" markierst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    • Bearbeitet Stefan Falz Mittwoch, 21. Dezember 2016 09:45
    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:46
    Mittwoch, 21. Dezember 2016 09:43
  • Hallo Rudolf,

    meiner Meinung nach ist die Verwendung der Registry für die meisten "normalen" Drittanbieteranwendungen überholt.

    Das OS darf sich dort gerne alles mögliche speichern, bei Anwendungen sehe ich es eher so, dass diese änderbare Einstellungsdaten in %userprofile%\AppData\, ProgramData, ... ablegen sollten. Eben dort, wo sie auch hingehören, also für den einzelnen User, für alle User, usw.

    Die Windows Registry hat ihre ersten Schritte, zumindest soweit mir bekannt, in Windows 3.1 gemacht. Seither hat sich vieles getan.

    Klar, jeder darf und soll sich seine eigene Meinung dazu bilden. Ich denke, dass die Registry der falsche Ort ist, um zur Laufzeit änderbare Anwendungseinstellungen/-informationen für alle User zu hinterlegen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    • Bearbeitet Stefan Falz Samstag, 17. Dezember 2016 11:33
    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:47
    Freitag, 16. Dezember 2016 21:47

Alle Antworten

  • Hallo Klaus,

    wie der Name des Schlüsses HKEY_CURRENT_USER schon sagt, ist das der Zweig für den aktuellen Benutzer. Daher hat jeder Benutzer seine eigenen Einstellungen, die hinterlegten Schlüssel und Werte können sich also unterscheiden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort vorgeschlagen Guido Franzke Donnerstag, 15. Dezember 2016 13:08
    Donnerstag, 15. Dezember 2016 09:25
  • Es gibt übrigens keinen Platz in der Registry für "all users" Daten. Die müsste man in HKEY_LOCAL_MACHINE abspeichern (und dazu wohl die Rechte dieses speziellen Keys ändern, dass die User darauf zugreiffen können).

    ... das noch als Nachtrag

    Rudolf

    Donnerstag, 15. Dezember 2016 21:52
  • Guten Morgen Rudolf,

    danke für die Antwort. Leider habe ich keine Ahnung, wie man die Rechte eines Registry Keys ändert. Kann mir jemand erklären wie das geht?

    Gruß

       Klaus.


    M. Thaddaeus

    Freitag, 16. Dezember 2016 06:13
  • Hallo Klaus,

    gar nicht (ok, stimmt nicht, ist gelogen^^ Aber Du sollst gar nicht erst darüber nachdenken, weil das IMHO sinnfrei ist). Du kannst nicht auf jedem PC, auf dem deine Software laufen soll, Berechtigungen für Registryzweige ändern. Das macht auch keinerlei Sinn, da es viele Alternativen gibt, Du musst sie nur annehmen.

    HKLM kann von den Usern gelesen aber nicht geschrieben werden. Wenn Du also bspw. bei der Installation deiner Anwendung (mit Adminrechten) im HKLM Zweig bestimmte Schlüssel ablegst, können die zur Laufzeit (ohne Adminrechte) von allen Usern gelesen werden. Aber schreiben kannst Du dort eben ohne Adminrechte nicht.

    Wenn überhaupt, solltest Du es andersrum machen also bei den Usern dann ein Administratorlogin per UAC anfordern und die Registrywerte dann ändern.

    Es gibt aber auch noch Verzeichnisse, die man verwenden könnte. Komplexe Einstellungen sind in der Regel in der Registry nicht mehr so gut aufgehoben, da serialisiert man lieber in eine Datei. Je nach Speicherort kann die dann auch von allen Benutzer gelesen und geschrieben werden.

    Beschreib daher bitte genau, was Du wo aus welchem Grund in welcher Form speichern willst und warum Du die Registry unbedingt verwenden willst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:50
    Freitag, 16. Dezember 2016 08:25
  • ... Aber Du sollst gar nicht erst darüber nachdenken, weil das IMHO sinnfrei ist ...

    Ja gut... in dem Fall sind aber die "public" Ordner für "alle Benutzer" auch sinnfrei. Diese Inkonsistenz ist einfach etwas sonderbar. ... und es kann dafür sicher Anwendungszwecke geben. Z.B. wenn man für diverse Nutzer was durchnummerieren will auf der Maschine. Wohin soll dann diese Zahl? ... gut, evtl. ein gekünsteltes Beispiel. Aber sowas gibt's. Oder Informationen zur letzten Verwendung eines Geräts, das am Computer angehängt ist? Bei dem alle Benutzer Zugriff drauf haben? Wo speichere ich das hin? In eine Datei? ... ist wohl die einzige Lösung. Oder eben der unschöne Registry-Key mit anderen Rechten. So oder so... es bleibt irgendwie unbefriedigend.

    Rudolf

    Freitag, 16. Dezember 2016 20:05
  • Hallo Rudolf,

    meiner Meinung nach ist die Verwendung der Registry für die meisten "normalen" Drittanbieteranwendungen überholt.

    Das OS darf sich dort gerne alles mögliche speichern, bei Anwendungen sehe ich es eher so, dass diese änderbare Einstellungsdaten in %userprofile%\AppData\, ProgramData, ... ablegen sollten. Eben dort, wo sie auch hingehören, also für den einzelnen User, für alle User, usw.

    Die Windows Registry hat ihre ersten Schritte, zumindest soweit mir bekannt, in Windows 3.1 gemacht. Seither hat sich vieles getan.

    Klar, jeder darf und soll sich seine eigene Meinung dazu bilden. Ich denke, dass die Registry der falsche Ort ist, um zur Laufzeit änderbare Anwendungseinstellungen/-informationen für alle User zu hinterlegen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    • Bearbeitet Stefan Falz Samstag, 17. Dezember 2016 11:33
    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:47
    Freitag, 16. Dezember 2016 21:47
  • Guten Morgen Ihr zwei netten Menschen, Hallo Rudolf, Hallo Stefan,

    vielen Dank für Eure Antworten. Die Einstelldaten meiner Anwendung habe ich nun in einer einfachen Textdatei im Dateiverzeichnis  %userprofile%\AppData\ProgramData\... gespeichert. Das klappt auch prima für alle User, doch es drängt sich mir die Frage auf, was sollen dann die ganzen Einträge von installierten Anwendungen unter HKLM\Software bewirken? Haben die alle die Zugriffsrechte geändert? Außerdem sollen ja die Registry Einträge der Ersatz für die alten *.ini Dateien sein.

    Gruß
       Klaus.


    M. Thaddaeus

    Samstag, 17. Dezember 2016 08:54
  • Hallo Klaus,

    zum einen ist HKLM ja für andere User lesbar. Die meisten Anwendungen werden, da man eben höhere Berechtigungen benötigt und diese meist beim User durch eine UAC Abfrage anfordern muss, lediglich bei ggfs. verwendeten Installationsroutinen, die ihrerseits oftmals mit Adminrechten laufen müssen, Daten in HKLM schreiben.

    In deinem Fall würde ich mir aber mal überlegen, ob es nicht sinnvoller ist, eine Settings Klasse oder ähnliches bei dir ins Projekt einzubauen und diese dann als XML, Json, Binär, ... zu serialisieren und bei Bedarf wieder zu deserialisieren. Damit kannst Du auch sehr komplexe Objekte lesen und schreiben.

    Da Du Visual C++ verwendest, kann ich dir leider keinen Code für sowas liefern. Für C# hatte ich mal ein komplettes Beispiel erstellt und hier im Forum gepostet.

      C# Serialisierung/Deserialisierung

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 17. Dezember 2016 09:20
  • Die Windows Registry hat ihre ersten Schritte, zumindest soweit mir bekannt, in Windows 3.1 gemacht. Seither hat sich vieles getan.

    Klar, jeder darf und soll sich seine eigene Meinung dazu bilden. Ich denke, dass die Registry der falsche Ort ist, um Anwendungseinstellungen/-informationen für alle User zu hinterlegen.

    Hallo Stefan

    Da hast du schon Recht. Aber es fehlt halt eine klare Ansage von Microsoft, wie das gehen soll. Unter Umständen wär's auch nicht schlecht, man hätte eine neue API, die wie die Registry-API läuft, aber sowas in private Dateien speichert. Wenn ich für jedes Programm irgendwas selber entscheiden muss oder ein eigenes XML-Schema bauen muss, wird das halt ziemlich schwierig. Sei es für die Entwickler, die Anwender oder die Administratoren. Der Registry-Editor ist an sich halt schon ein tolles Tool. Weil ich damit für jedes Programm alle Einstellungen finden, auslesen und bearbeiten kann. Wobei mir schon klar ist, dass man die Daten erst verstehen muss. Wäre aber bei XML z.B. noch schwieriger.

    ... aber gut ... es wird philosophisch ... :-)

    Rudolf

    Samstag, 17. Dezember 2016 11:28
  • Guten Morgen Stefan,

    leider habe ich mit XML noch nie etwas zu tun gehabt. Ich habe mir Deinen Code mal herunter geladen, verstehe allerdings nach der ersten kurzen Sichtung nur "Bahnhof, Koffer klauen". Was man mit XML anfangen kann ist mir vollkommen schleierhaft. Kannst Du mir vielleicht mal nen Tip geben, wo ich mich da mal einlesen kann? Für Anfänger versteht sich, denn ich muß zunächst mal die Grundlagen verstehen. Die höheren Weihen kommen vielleicht dann später.

    Danke für Deine Mühe.

    Gruß,
       Klaus.


    M. Thaddaeus

    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:46
    • Tag als Antwort aufgehoben m-thaddaeus Samstag, 24. Dezember 2016 06:47
    Mittwoch, 21. Dezember 2016 09:04
  • Hallo Klaus,

    mit XML musst Du eigentlich gar nichts machen. Es geht hierbei nur um die Serialisierung und Deserialisierung deiner Settings.

    Mittels Serialisierung erzeugst Du aus einem einfachen oder auch sehr komplexen Objekt eine statische Abbildung der Eigenschaften des Objekts. Diese wiederum kann man bspw. in einer Datei, einer Datenbank, ... für eine spätere Wiederverwendung ablegen.

    Die Deserialisierung nimmt die statische Abbildung, erzeugt ein entsprechendes Objekt und füllt die Werte der gespeicherten Eigenschaften.

    Wenn Du also bspw. eine Klasse Settings mit den Eigenschaften BackgroundColor und ForegroundColor hast, könnte das in etwa so aussehen:

    [Serializable]
    public class Settings
    {
        public String BackgroundColor { get; set; }
        public String ForegroundColor { get; set; }
    
        public Settings()
        {
            this.BackgroundColor = "#FFFFFF";
            this.ForegroundColor = "#000000";
        }
    }

    Mittels Serialisierung speicherst Du die Instanz deiner Settings Klasse in eine XML Datei (andere Formate gehen natürlich auch) und beim nächsten Programmstart liest Du sie eben wieder aus.

    Mit XML an sich musst Du dich hierfür gar nicht beschäftigen.

    ---

    Die eigentliche Frage ist ja aber nun doch ausreichend beantwortet, daher würde ich vorschlagen, die weiteren Fragen in einem neuen Thread zu behandeln. Diesen hier könntest Du bitte abschließen, in dem Du die hilfreichsten Antworten bewertest und ggfs. "als Antwort" markierst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    • Bearbeitet Stefan Falz Mittwoch, 21. Dezember 2016 09:45
    • Als Antwort markiert m-thaddaeus Samstag, 24. Dezember 2016 06:46
    Mittwoch, 21. Dezember 2016 09:43
  • Guten Tag Rudolf, guten Tag Stefan,

    Euch beiden möchte ich nochmals für Eure Mühe danken. Mein Problem ist mit Euren Antworten gelöst und mit XML werde ich mich vielleicht später einmal beschäftigen.

    Ich wünsche Euch beiden ein frohes Weihnachtsfest und ein glückliche neue Jahr.

    Gruß
       Klaus.


    M. Thaddaeus

    Samstag, 24. Dezember 2016 06:54