Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Andere Codevariante für Registryeintragung ?? (https://www.delphipraxis.net/25511-andere-codevariante-fuer-registryeintragung.html)

Vader 7. Jul 2004 20:18


Andere Codevariante für Registryeintragung ??
 
hallo,

gibt für diesen code auch eine andere variante, weil auf einmal
funzt dieser code bei mir nicht mehr ( proggi in den autostart )

Code:
procedure TForm1.FormCreate(Sender: TObject);
var MyReg:TRegistry;

 begin
  MyReg:=TRegistry.Create; MyReg.Rootkey:=hkey_local_machine; MyReg.Openkey('Software\Microsoft\Windows\CurrentVersion\Run',true); MyReg.WriteString('Works',Application.ExeName); MyReg.CloseKey; MyReg.Free;
 end;
mfg vader

MathiasSimmack 7. Jul 2004 20:39

Re: Andere Codevariante für Registryeintragung ??
 
Könnte es damit zusammenhängen, dass du ein NT-System hast (NT, 2000 oder XP), und dass du dieses Mal dein Programm nicht als Admin startest? In dem Fall scheitert´s an den Rechten.
Mir war, als hätte ich erst kürzlich dazu eine Variante geschrieben, die die Rechte berücksichtigt. *denk und such* yeah, there it is. ;)

Vader 8. Jul 2004 18:16

Re: Andere Codevariante für Registryeintragung ??
 
hallo


hab den code probiert aber es kommt der fehler:
[Fehler] Unit1.pas(36): Undefinierter Bezeichner: 'IsAdmin'


Code:
procedure Autostart(const fForAllUsers: boolean = true);
const
  RootKey : array[boolean]of HKEY =
    (HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE);
var
  reg    : TRegistry;
begin
  reg    := TRegistry.Create;
  if(reg <> nil) then
  try
    reg.RootKey := RootKey[IsAdmin and fForAllUsers];

    if(reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',
      true)) then
    try
      reg.WriteString('Programm-Name', paramstr(0));
    finally
      reg.CloseKey;
    end;
  finally
    free;                
  end;
end;

und noch was, wo kommt der code hin ich hab 's in formcreate hineinkopiert
mfg vader

mfg

MathiasSimmack 8. Jul 2004 18:29

Re: Andere Codevariante für Registryeintragung ??
 
Entschuldige, aber das kommt vom blinden Kopieren und "Nicht-Lesen". Dabei steht in dem gelinkten Beitrag groß drunter:
Zitat:

Zitat von MathiasSimmack
benötigt lediglich: [dp]"IsAdmin"[/dp] von Nico.


Vader 8. Jul 2004 18:59

Re: Andere Codevariante für Registryeintragung ??
 
hallo,

das habe ich ja gelesen aber da komm ich zu einige beiträge,
ich weiß nicht was du meinst ,
"du benötigst lediglich Is Admin von Nico ??????


mfg vader

MathiasSimmack 8. Jul 2004 20:28

Re: Andere Codevariante für Registryeintragung ??
 
Das ist ein Suchlink, der alle Beiträge auflistet, in denen das magische Wort "IsAdmin" vorkommt. Wenn du dir mal ein bisschen Zeit nimmst, dann findest du die komplette Funktion. Als Tipp: gaaaaaaaaaaaanz unten in der Suchliste. :roll:

Vader 9. Jul 2004 06:28

Re: Andere Codevariante für Registryeintragung ??
 
hallo mathias,

das heißt also das dieser code nur funzt wenn ich admin bin ?

un mit dem link auf den anderen code kann ich herausfinden ob ich adminrechte habe


mfg vader

MathiasSimmack 9. Jul 2004 07:42

Re: Andere Codevariante für Registryeintragung ??
 
:cry: Wie wäre es denn mal mit Nachdenken? Ich meine, so schwer kann das doch nicht sein. Ansonsten, ohne dir zu nahe treten zu wollen, wäre ein Grundlagen-Tutorial oder -Buch vllt. besser. Wenn du dir das mal anschaust:
Zitat:

Zitat von Vader
Delphi-Quellcode:
procedure Autostart(const fForAllUsers: boolean = true);

Standardmäßig steht der Parameter dieser Prozedur auf true. Wenn dein Englisch gut ist, dann müsste dir "fForAllUsers" sagen, dass es "für alle Benutzer" bedeutet. Soll heißen: das automatisch zu startende Programm soll (sofern möglich) generell starten, egal welcher Benutzer sich anmeldet.

Und das "sofern möglich" wird in dieser Zeile definiert:
Zitat:

Delphi-Quellcode:
    reg.RootKey := RootKey[IsAdmin and fForAllUsers];

Das bedeutet, nur wenn du lokaler Admin bist (die Funktion hast du inzwischen ja gefunden) und wenn der Parameter aus dem Funktionskopf auf "true" gesetzt ist, dann wird der Schlüssel HKEY_LOCAL_MACHINE benutzt. Das bezieht sich einfach auf dieses Array hier:
Zitat:

Delphi-Quellcode:
const
  RootKey : array[boolean]of HKEY =
    (HKEY_CURRENT_USER, // <-- FALSE
     HKEY_LOCAL_MACHINE // <-- TRUE);

Das heißt, wenn du kein Admin bist oder wenn du den Parameter im Prozedurkopf auf FALSE setzt und dann den Autostart möchtest, dann wird das Programm grundsätzlich in HKEY_CURRENT_USER eingetragen und startet daher nur, wenn du dich mit dem gleichen Benutzer anmeldest.

Edit: Ich hätte es auch mit if machen können, dann wäre es vllt. deutlicher gewesen:
Delphi-Quellcode:
if IsAdmin and fForAllUsers then
  reg.RootKey := HKEY_LOCAL_MACHINE
else
  reg.RootKey := HKEY_CURRENT_USER;
Das bool-Array macht also das gleiche wie diese if-Prüfung, nur dass du eben kein if/else benötigst.


Das ist das Geheimnis des Codes, und Ja: Mit der Funktion "IsAdmin" kannst du herausfinden ob du Admin-Rechte hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz