Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Fr 26.12.03 14:19 
Ich möchte beim Programmstart prüfen, ob der User Schreibrechte auf die Registry besitzt. Wenn nicht soll die entsprechende Checkbox enabled werden.

Außerdem soll geprüft werden, ob bereits ein registry-Eintrag vorhanden ist. Wenn ja, dann soll die Checkbox einen Hacken bekommen.

Ich hab versucht die so zu lösen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TFOptionen.FormCreate(Sender: TObject);
var regist : TRegistry;
begin
  regist:=TRegistry.Create;
  try
    regist.Access:=KEY_ALL_ACCESS  ;
    regist.RootKey:=HKEY_CLASSES_ROOT;
    regist.OpenKey('*\Shell\ShredExplor\command', true);
    if regist.ReadString('')<>'' then
      FOptionen.CBKontextmen.Checked:=true else
        FOptionen.CBKontextmen.Checked:=false;
  except
      FOptionen.CBKontextmen.Enabled:=false;
  end;
  showMessage(regist.ReadString(''));
  regist.Free;
end;


Wenn ich die Schreibrechte besitze, dann funktioniert der Code. Hab ich jedoch keine Schreibrechte, dann ist die Checkbox trotzdem aktiv.

Dafür wird jedoch (fälschlich) kein Hacken gesetzt, obwohl der Registry-Eintrag vorhanden ist.

Also scheinbar ist der Code voller Fehler. :cry:

Wer kann mir sagen, wie es richtig funktionieren sollte.

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
tomtom62
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278

WIN 2000, XP prof
D5 prof.
BeitragVerfasst: Fr 26.12.03 14:37 
Ich würde das in zwei Teile teilen.

1. Versuch beim Start (Formshow ist vielleicht besser) zuerst mal,
ob der entsprechende Eintrag in der Registry da ist.

Das machst Du mittels Openkey wie unten aber:
ausblenden Delphi-Quelltext
1:
    regist.OpenKey('*\Shell\ShredExplor\command', FALSE);					


Damit wird der Schlüssel nur geprüft, aber nicht geschrieben, wenn er noch fehlt..

2. Erstelle für Dein Programm einen eigenen Registry Eintrag bei der Installation und versuche darin was zu Schreiben..

Das geht auch mittels Openkey mit dem Parameter TRUE. Damit fummelst Du aber dann nicht an essentiellen Registry Einträgen rum, sondern in Deinem eigenen Bereich.

Also musst Du dann nur noch abfragen

Key da oder nicht (1.)

Schreibrechte da oder nicht (2.)

Aus diesen Kombinationen baust Du dann die Aktivierung Deiner Checkbox.

Gruss

Thomas
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.12.03 16:10 
Ich würde es ganz anders machen. Wenn du herausfinden willst, ob bereits der Wert existiert, dann brauchst du dazu schon mal nicht alle Zugriffsrechte, und du kannst auch darauf verzichten, den Schlüssel anzulegen (wie tomtom62schon schrieb). Leserechte reichen und funktionieren dann auch mit normalen bzw. eingeschränkten Benutzerrechten problemlos:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
regist := TRegistry.Create(KEY_READ); // <-- #1
if(regist <> nil) then
  with regist do
  try
    RootKey := HKEY_CLASSES_ROOT;
    if(OpenKey('*\Shell\ShredExplor\command',
      FALSE)) then // <-- #2
    try
      FOptionen.CBKontextmen.Checked :=
        (ReadString('') <> '');
    finally
      CloseKey;
    end;
  finally
    Free;
  end;

Du könntest aber zur Sicherheit noch mit "pos" prüfen, ob der Name deines Programms auch in dem ausgelesenen String vorkommt. Also bspw. so (ungetestet!):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    if(OpenKey('*\Shell\ShredExplor\command',
      FALSE)) then
    try
      s := ReadString('');
      FOptionen.CBKontextmen.Checked := (s <> '') and
        (pos(uppercase(paramstr(0)),uppercase(s)) > 0);
    finally
      CloseKey;
    end;


Das Schreibproblem sehe ich persönlich nicht als solches an. Man kann davon ausgehen, dass man min. Admin-Rechte haben sollte. Ich habe erst kürzlich bei einer anderen Frage darauf verwiesen: Suche in der Delphi-PRAXiS ISADMIN. Schau dir mal die Beiträge an, die die Suchfunktion der Delphi-Praxis ausspuckt. Viele sind´s nicht, und in einem davon hat Luckie Code gepostet, mit dem du herausfinden kannst, ob du Admin-Rechte hast oder nicht. Anwendungsbeispiel (falls möglich, dann auch in "OnCreate"):
ausblenden Delphi-Quelltext
1:
FOptionen.CBKontextmen.Enabled := IsAdmin;					

Voilà.

Und auch wenn du dann Admin-Rechte hast, will sagen: wenn die Checkbox verfügbar ist, solltest du nicht auf try/finally verzichten. Es kann trotzdem mal was schiefgehen, und dann bekommst du (bzw. evtl. der Anwender) unschöne Fehlermeldungen um die Ohren.


@tomtom62:
Zitat:
(Formshow ist vielleicht besser)

"OnCreate" ist schon in Ordnung. :)