Windows Registry Problem



  • Guten Morgen,

    mit der Registry habe ich ein Problem. Ich schreibe ei Programm, welches nach dem Start auf durch Benutzer änderbare Daten angewiesen ist. Diese Daten sollen in der Registry gespeichert werden. Wie erreiche ich es, daß bei jedem eingeloggten Benutzer, verfüge er Administrator Privileg oder nicht, das Programm immer auf die gleichen Registry Schlüssel zugreifen kann?

    Ich vermutete, daß meine Schlüssel entweder unter HKEY_LOCAL_MACHINE\Software oder unter HKEY_ALL_USERS\Software angesiedelt sein müssten. Leider ist es mir bzw. meinem Programm nicht möglich, dort meine Unterschlüssel anzulegen. Das Ergebnis ist immer Code 5 (ERROR_ACCESS_DENIED). Was kann ich tun?

    K. H. Renders.


  • Mod

    Nicht die Registry verwenden. 😉
    Alle "allgemein zugänglichen" Bereiche können nur mit Admin Rechte geschrieben werden. Verwende eine Datei im ProgramData Ordner.



  • [quote="Martin Richter"]Nicht die Registry verwenden. 😉
    Alle "allgemein zugänglichen" Bereiche können nur mit Admin Rechte geschrieben werden. Verwende eine Datei im ProgramData Ordner.[/quote]

    Danke für die schnelle Antwort. Natürlich benutze ich momentan eine Binärdatei, welche im Bereich des ausführbaren Moduls gespeichert ist. Diese enthält die entsprechenden Daten. Wenn die allerdings versehentlich gelöscht wird, sieht es relativ finster aus! Der User würde ein paar Probleme bekommen, da über diese Daten der Zugriff auf weitere verschiebbare Dateien ermöglicht wird. Es wäre allerdings möglich, für diesen Fall eine spezielle Suchfunktion einzubauen.

    Andererseit müßte es eigentlich möglich sein, meinem Programm für derartige Zwecke Administratorrechte einzuräumen. Z. B. könnte ich mir vorstellen, daß dies über die Datei *.exe.embed.manifest geschehen könnte. Ob und wie das allerdings gehen könnte ist mir unklar da ich diese Datei noch nie direkt benutzt habe

    K. H. Renders


  • Mod

    Nö.



  • C:\Users\Public ist eigentlich dafür geeignet.


  • Mod

    roflo schrieb:

    C:\Users\Public ist eigentlich dafür geeignet.

    Da ist ProgramData aber besser, weil es ein versteckter Ordner ist.



  • [quote="Martin Richter"][quote="roflo"]C:\Users\Public ist eigentlich dafür geeignet.[/quote]

    Da ist ProgramData aber besser, weil es ein versteckter Ordner ist.[/quote]

    In diesem Fall muß ich Martin Richter zustimmen!

    Allerdings bin ich davon überzeugt, daß die Registry die Möglichkeit der Speicherung und des Abrufes von Daten auch für unterschiedliche User Accounts ermöglicht. Wenn man sich HKEY_LOCAL_MACHINE\Software anschaut, so sind dort eine Menge Schlüssel von installierten Anwendungen zu finden. So sollen auch unter HKEY_CURRENT_USER\Software gespeicherte Schlüssel auf HKEY_LOCAL_MACHINE und/oder auf HKEY_ALL_USERS\??? gespiegelt werden. Nur wie und wo ist mir nicht bekannt - leider, denn dann müßte ich Euch nicht belästigen.

    K. H. Renders.



  • Auf HKEY_LOCAL_MACHINE kann der User nur lesend zugreifen, der Admin auch schreibend.
    Wenn du ein Installationsprogramm nutzt, kann dieses doch in HKLM schreiben, da es Admin-Rechte anfordert. Das Programm mit User-Rechten kann dann aus HKLM lesen.
    Soll das Programm mit User-Rechten den Pfad ändern können: ein zweites kleines Programm erstellen, das Admin-Rechte erfordert (Manifest, requireAdministrator) und somit in HKLM schreiben darf. Das Änderungs-Programm kann vom Hauptprogramm aufgerufen werden.
    Oder halt die Dateilösung im ProgramData-Ordner.


  • Mod

    Man kann auch die Rechte für einen HKLM Pfad verändern. Würde ich aber nicht machen.
    Sowas könnte der Installer machen.



  • Hallo,

    du kannst deinem Programm doch auch Admin - Rechte geben.

    Menü Projekt --> Eigenschaften

    Linker --> Manifestdatei

    UAC - Ausführungsebene = requireAdministrator (/level='requireAdministrator')



  • HermannGo schrieb:

    du kannst deinem Programm doch auch Admin - Rechte geben.

    *facepalm*



  • @HermannGo
    Dann kann das Programm nur mehr von Admins ausgeführt werden. Was meist nicht das ist was man will.



  • M. Thaddaeus schrieb:

    Natürlich benutze ich momentan eine Binärdatei, welche im Bereich des ausführbaren Moduls gespeichert ist. Diese enthält die entsprechenden Daten. Wenn die allerdings versehentlich gelöscht wird, sieht es relativ finster aus!

    %ProgramData% ist nicht "im Bereich des ausführbaren Moduls".
    %ProgramData% ist wo Programme ihre Dateien ablegen können, die auch im normalen Betrieb geschrieben werden müssen.
    Dort legt man aber normalerweise keine .EXEn ab.

    Und in %ProgramFiles%, wo man üblicherweise Programme hin installiert, wenn sie von einem Admin installiert werden, haben normale Benutzer keine Schreibrechte.

    ----

    @all:

    Gibt es einen "üblichen" Weg wie man Programme so macht dass sie wahlweise sowohl "portable" als auch in %ProgramFiles% installiert funktionieren?
    Wobei beim "portable" Betrieb natürlich nicht %ProgramData% verwendet werden soll, da %ProgramData% ja auf dem PC bleibt, das portable Programm aber u.U. auf ne USB Stick mit rumgetragen wird - und dabei auch die Einstellungen mitnehmen sollte.

    Dazu bräuchte man ja einen Weg zu entscheiden ob man die änderbaren Datenfiles in dem Verzeichnis sucht wo auch die .exe liegt (portable), oder ob man %ProgramData% verwendet.
    Jetzt fallen mir zwar durchaus Möglichkeiten ein*, aber es würde mich interessieren ob einen "kanonischen" Weg gibt wie man das macht.

    *:
    - Man könnte gucken ob das .exe Verzeichnis ein Unterverzeichnis von %ProgramFiles% bzw. %ProgramFiles(x86)% ist. Versagt wenn das Programm in ein anderes Verzeichnis installiert werden soll, wo normale Benutzer auch keine Schreibrechte haben.

    - Man könnte einfach ausprobieren ob man im .exe Verzeichnis Schreibrechte hat. Versagt dann aber wenn ein Admin das Programm startet.

    - Man lässt den Installer ein "Tag-File" in das .exe Verzeichnis kopieren. Das Programm prüft dann ob das "Tag-File" vorhanden ist. Wenn ja, wird dieses Verzeichnis genommen. Wenn nein dann "portable". Das ist vermutlich noch die beste Möglichkeit - zumindest fällt mir hier kein Fall ein wo es nicht funktionieren würde.

    - Das selbe umgekehrt: Man hat bei "portable" Installationen immer ein Datenfile im .exe Verzeichnis liegen. Wenn es existiert dann "portable", wenn nicht dann %ProgramData%. Versagt wenn der User das Datenfile löscht (z.B. in einem Versuch alle Einstellungen auf Defaults zurückzusetzen).

    - Einfach immer ins Verzeichnis der .exe schreiben und die entsprechenden Workarounds in Windows die Zugriffe auf ein anderes Verzeichnis umleiten lassen. Vermutlich auch problematisch wenn man das Programm dann mal als Admin startet.


Log in to reply