Announcement

Collapse
No announcement yet.

Einträge in Registry unter NT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Einträge in Registry unter NT

    Ich habe einige Einstellungen in meinen Programmen in der Windows-Registry abgelegt. Unter win95+98 funktioniert dies auch einwandfrei. Unter Windows NT habe ich nun das Problem, dass nur User mit Administrator-Rechten diese Einträge lesen können.
    Mir würde es volkommen reichen, wenn der User mit Benutzer-Rechten Einträge in
    HKEY_CURRENT_USER lesen und ändern und in
    HKEY_LOCAL_MACHINE oder HKEY_CURRENT_CONFIG nur lesen könnte
    Dies funktioniert einwandfrei, wenn er die Regedit direkt aufruft, nicht aber, wenn ers es über ein Delphi5-Programm machen will.
    Verwendet werden die Befehle:

    Regist := TRegistry.Create;
    Regist.RootKey:=HKEY_LOCAL_MACHINE;
    Regist.OpenKey('\Software\Magnetic GmbH\keyPaulus\MaQMa', true);
    if Regist.ValueExists('Eintrag') then
    if Regist.ReadInteger('Eintrag')<>100 then
    Regist.WriteInteger('Eintrag', 100);
    Regist.CloseKey;
    Regist.Free;

    Vielen Dank im Voraus

    Gerd

  • #2
    Hallo,

    in der Tat geht Borland hier etwas ungeschickt vor, indem der Schlüssel mit vollen Rechten angefordert wird. Allerdings kann man seinen eigenen Ableger implementieren, der nur READ_ONLY-Rechte anfordert, indem die von TRegistry geerbte Methode <b>OpenKey</b> überschrieben wird:
    <pre>
    uses
    Windows, Registry;

    type
    TNTRegistry = class(TRegistry)
    private
    public
    function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
    end;
    </pre>
    Die neue Methode könnte zum Beispiel so aussehen:
    <pre>
    function TNTRegistry.OpenKey(const Key: string; CanCreate: Boolean):
    Boolean;
    var
    TempKey: HKey;
    S: string;
    Disposition: Integer;
    Relative: Boolean;
    begin
    S := Key;
    Relative := IsRelative(S);
    if not Relative then Delete(S, 1, 1);
    TempKey := 0;
    if not CanCreate or (S = '') then
    begin
    Result := RegOpenKeyEx(GetBaseKey(Relative), PChar(S), 0,KEY_READ or
    KEY_WRITE, TempKey) = ERROR_SUCCESS;
    end else
    Result := RegCreateKeyEx(GetBaseKey(Relative), PChar(S), 0, nil,
    REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil,
    TempKey, @Disposition) = ERROR_SUCCESS;
    if Result then
    begin
    if (CurrentKey <> 0) and Relative then
    S := CurrentPath + '\' + S;
    ChangeKey(TempKey, S);
    end;
    end;
    </pre>
    Bei Bedarf kann man nun die Argumente für <b>RegCreateKeyEx</b> nach Herzenslust (und entsprechendem Studium in der SDK-Hilfe) ändern ;-)

    P.S: Mit Delphi 5 ist das nicht mehr notwendig, denn hier wurde der Constructor <b>Create</b> überladen:
    <pre>
    constructor TRegistry.Create;
    begin
    RootKey := HKEY_CURRENT_USER;
    FAccess := KEY_ALL_ACCESS;
    LazyWrite := True;
    end;

    constructor TRegistry.Create(AAccess: LongWord);
    begin
    Create;
    FAccess := AAccess;
    end;
    </pre>
    &#10

    Comment

    Working...
    X