Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Seriennummer Informationen in Registry schreiben (https://www.delphipraxis.net/153944-seriennummer-informationen-registry-schreiben.html)

gmc616 25. Aug 2010 11:58

AW: Seriennummer Informationen in Registry schreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1044775)
... Wie man allerdings die Sache mit der WOW6432Node in den Griff bekommt ...

So: Registry: WOW6432NODE

mkinzler 25. Aug 2010 12:01

AW: Seriennummer Informationen in Registry schreiben
 
Man könnte dieses Recht auch einfach anfordern ( elevation)

DeddyH 25. Aug 2010 12:25

AW: Seriennummer Informationen in Registry schreiben
 
Zitat:

Zitat von gmc616 (Beitrag 1044792)
Zitat:

Zitat von DeddyH (Beitrag 1044775)
... Wie man allerdings die Sache mit der WOW6432Node in den Griff bekommt ...

So: Registry: WOW6432NODE

Thx, das schaue ich mir bei nächster Gelegenheit genauer an :thumb:

generic 25. Aug 2010 14:45

AW: Seriennummer Informationen in Registry schreiben
 
Zitat:

Zitat von dor557 (Beitrag 1044783)
Was die Schreibrechte in der Registry angeht da muss ich mir wohl wirklich etwas ausdenken.

Es wid wohl darauf hinaus laufen das ich in der Anwendung feststellen muss ob ich Admin bin oder nicht und dann den Hinweis geben das admin rechte benötigt werden damit die Seriennummer Rechnerweit gepeichert werden kann.

Ansonsten wird die eben nur dem User zugewiesen und gut ist.

Du kannst natürlich die Adminrechte anfordern vom UAC.
Dann machst du ein Knopf mit Schild "Seriennummer eingeben". Dieser Knopf impersonated dann zum Admin.

Sakura (Daniel) hat dazu Beispiel gemacht?!
Zumindest habe ich mal eine Demo gesehen.

dor557 30. Aug 2010 10:42

AW: Seriennummer Informationen in Registry schreiben
 
Zitat:

Zitat von generic (Beitrag 1044872)
Du kannst natürlich die Adminrechte anfordern vom UAC.
Dann machst du ein Knopf mit Schild "Seriennummer eingeben". Dieser Knopf impersonated dann zum Admin.

Sakura (Daniel) hat dazu Beispiel gemacht?!
Zumindest habe ich mal eine Demo gesehen.

Ich habe nach der Demo gesucht. Nichts Gefunden. Aber Das wäre schon net schlecht wenn man zur laufzeit einfach die Adminrechte abrufen kann um etwas aus zu führen.
Wo hassn das gesehen ?

So aber was anderes. Was mich nun total verwirrt. Ich hoffe auf Erleuchtung.

Ich hatte zum Lesen folgenden Code geschrieben :

Delphi-Quellcode:
   Reg := TRegistry.Create;
   with Reg do
   begin
      RootKey := HKEY_LOCAL_MACHINE;
      Ver := inttostr(Version.Hauptversion) + '.' + inttostr(Version.Nebenversion);
      Ver_new := ver;
      OpenKeyReadOnly(RegPath+Ver);
      if KeyExists('S/NR') then
        MainConfig.SENR := ReadString('S/NR') else MainConfig.SENR := '';
      if KeyExists('firma') then
        MainConfig.Firma := ReadString('firma') else MainConfig.Firma := '';
      CloseKey;
    end;
so nun (Ich weiss ich wiederhole mich) in XP konnte die Funktion KeyExists mir ein true geben. Unter 7 ein False. (Vista noch nicht versucht)

nun habe ich eine naja mehr oder weniger eingebung gehabt und habe mir gedacht das Keys ja eigentlich nicht die Einträge sind sondern die Schlüssel "Ordner".

also kam Folgendes dabei raus :

Delphi-Quellcode:
   Reg := TRegistry.Create;
   with Reg do
   begin
      RootKey := HKEY_LOCAL_MACHINE;
      Ver := inttostr(Version.Hauptversion) + '.' + inttostr(Version.Nebenversion);
      Ver_new := ver;
      OpenKeyReadOnly(RegPath+Ver);
      if ValueExists('S/NR') then
        MainConfig.SENR := ReadString('S/NR') else MainConfig.SENR := '';
      if ValueExists('firma') then
        MainConfig.Firma := ReadString('firma') else MainConfig.Firma := '';
      CloseKey;
    end;
:wall:

So nun kann ich das wenn die Software als Admin gestartet ist speichern und als user lesen :)

Aber nun erkläre mir mal jemand das XP das akzeptiert hat obwohl es eigentlich ja schon von anfang an falsch programmiert wurde oder ? :gruebel:

himitsu 30. Aug 2010 10:49

AW: Seriennummer Informationen in Registry schreiben
 
Zitat:

Zitat von dor557 (Beitrag 1046041)
Du kannst natürlich die Adminrechte anfordern vom UAC.
Dann machst du ein Knopf mit Schild "Seriennummer eingeben". Dieser Knopf impersonated dann zum Admin.

http://www.michael-puff.de/Programmi...ersonate.shtml oder Hier im Forum suchenImpersonate

Aber wenn ich das richtig verstanden hab, dann sollte hier z.B. ein OutOfProcessServer, welche mit den nötigen Adminrechten läuft, besser sein.

[edit] hatte ich mir doch mal was gemerkt
http://www.delphipraxis.net/151099-e...ml#post1019460

dor557 31. Aug 2010 16:11

AW: Seriennummer Informationen in Registry schreiben
 
also die Methode habe ich versucht. Aber das geht warscheinlich nur bei XP oder NT. unter Vista und windows 7 geht das nicht. werde wohl auch auf die Methode mit einer Externen exe zurückgreifen müssen.

gruss Sascha

kuba 5. Mär 2012 18:32

AW: Seriennummer Informationen in Registry schreiben
 
Hallo,

hab mal kurz durchgelesen, hat das Programm eine Setup-Routine ?
Das Setup Programm benötigt Admin-Rechte, da kannste vielleicht schon beim Setup die Eingabe der Seriennummer realisieren.

Im übrigen, falls es sich um eine 32 Bit Anwendung handelt (vermute ich mal) dann gehören die Key's selbstverständlich unter "WOW6432Node" von da werden Sie auch ganz automatisch wieder gelesen, da muss man nichts machen !

Welch Unfug ein 32-Bit Programm unter 'HKEY_LOCAL_MACHINE\Software\Mein Programmm' Einträge schreiben zu lassen. Das gehört unter 'HKEY_LOCAL_MACHINE\Software\WOW6432Node\Mein Programmm', ist doch wohl logisch...

Es sei denn du willst sowas machen: 'HKEY_LOCAL_MACHINE\Software\Microsoft\...'

Beim Lesen von Registry Keys sollte man übrigens auf 'ReadOnly' achten, sonst passiert irgendwann dies.

kuba

mz23 6. Mär 2012 07:03

AW: Seriennummer Informationen in Registry schreiben
 
Zitat:

Zitat von dor557 (Beitrag 1043944)
Servus zusammen.
hier mal der Code der das Speichern soll :

Delphi-Quellcode:
Procedure TMainForm.Reg_Sav;
var Reg : TRegistry;
    ver : String;
begin
  Reg := TRegistry.Create;
  with Reg do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    OpenKey('Software\DeveloperName\AppName\', True);
    WriteString('firma', MainConfig.Firma);
    WriteString('S/NR', MainConfig.SENR);
    CloseKey;
    Free;
  end;
end;
gruss Sascha

Delphi-Quellcode:
var regist: TRegistry;
begin
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    regist.OpenKey('Software\MeineFirma\MeinProgramm\1.0', true);
    regist.WriteInteger('Left', Form1.Left);
    regist.WriteInteger('Top', Form1.Top);
  finally
    regist.free;
  end;
end;
Bischen Info dazu, da Du geschrieben hast, Dir ist das alles
etwas suspekt, was da passiert (passieren soll).

Als erstes wird nun eine Instanz mit dem Namen "regist" der Klasse TRegisty gebildet. Statt "regist" kann natürlich jeder beliebige, gültige Variablenname verwendet werden.

Als Hauptschlüssel (RootKey) wird hier HKEY_CURRENT_USER verwendet. Diese Zuweisung wäre nicht nötig, da dieser Hauptschlüssel standardmäßig verwendet wird, wenn RootKey nichts zugewiesen wird - aber sicher ist sicher.

Nun wird der Schlüssel geöffnet, in den wir unsere Daten schreiben wollen. Der Boolean-Wert (zweiter Parameter von OpenKey) hat folgende Bedeutung: Bei "true" wird der Schlüssel erzeugt, wenn er noch nicht existiert, bei "false" nicht.

Mit den Methoden WriteInteger werden die Daten gespeichert. Der erste Wert gibt den Namen an, unter dem der folgende Wert (zweiter Parameter) später wieder abrufbar ist. Bei "WriteInteger" muss der zu speichernde Wert natürlich eine Ganzzahl sein. Daneben gibt es für andere Datentypen entsprechende Methoden wie "WriteString", "WriteDateTime", "WriteFloat" usw.

Wird der Registry-Zugriff nicht mehr benötigt, sollte er geschlossen werden (regist.free). Damit wird der Speicherplatz der Instanz "regist" im Arbeitsspeicher wieder freigegeben. Wäre stattdessen ein Zugriff auf einen anderen Schlüssel nötig gewesen, hätte der aktuelle über "CloseKey" geschlossen werden können.

Spezielle Schlüssel in der Registry
Wer etwas in der Registry stöbert, findet einige interessante Schlüssel, die auch von eigenen Anwendungen ausgelesen werden können.

Gutes Beispiel ist der Schlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion. Zu beachten ist nur, dass unter NT und höher statt "Windows" der Schlüssel "Windows NT" verwendet werden muss.

CurrentVersion Windows-Version, z.B. 5.0
ProductName Klartext Windows-Version, z.B. Microsoft Windows 2000
RegisteredOwner Name des Besitzers
RegisteredOrganization Name der Firma
SourcePath Verzeichnis, aus dem Windows installiert wurde (meist CD)
PathName Windows-Verzeichnis

Allerdings gibt es für alle o.g. Beispiele auch Windows-Funktionen, die die entsprechenden Werte zurückliefern. Wenn man diese verwendet, ist man auf der sicheren Seite und muss nicht berücksichtigen, unter welchen Windows-Versionen sich die Werte in welchen Keys verstecken.

Delphi-Quellcode:
var regist: TRegistry;
begin
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    regist.OpenKey('Software\MeineFirma\MeinProgramm\1.0', true);
    Form1.Left := regist.ReadInteger('Left');
    Form1.Top := regist.ReadInteger('Top');
  finally
    regist.free;
  end;
Den Read-Methoden (hier ReadInteger) wird in Klammern der Name des Wertes übergeben, der ausgelesen werden soll. Dieser Wert wird dann, wie bei Funktionen üblich, als Ergebniswert zurückgeliefert.

Nun könnte es sein, dass es sich beim Ausführen obiger Methode um den ersten Programmstart handelt, der Schlüssel MeineFirma\MeinProgramm\1.0 also noch gar nicht existiert. Da wir bei OpenKey als zweiten Parameter "true" angegeben haben, wird der Schlüssel dadurch erzeugt. Die Werte "Left" und "Top" gibt es aber nach wie vor nicht und können deshalb auch nicht ausgelesen werden. In solchen Fällen löst die Laufzeitumgebung eine Exception (ERegistryException) aus. Am saubersten ist es, vor dem Lesen zu prüfen, ob der gewünschte Key existiert. Die Funktion "OpenKey" gibt true zurück, wenn der gewünschte Schlüssel vorhanden ist, ansonsten false. Das Vorhandensein einzelner Werte lässt sich mit "ValueExists" prüfen

Delphi-Quellcode:
var
  regist: TRegistry;
begin
  // Default-Werte setzen, falls Werte nicht in Registry vorhanden
  Form1.Left := 0;
  Form1.Top := 0;

  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    if regist.OpenKey('Software\MeineFirma\MeinProgramm\1.0', false) then
    begin
      try
        // Prüfen, ob Wert "Left" vorhanden
        if regist.ValueExists('Left') then
          Form1.Left := regist.ReadInteger('Left');

        // Prüfen, ob Wert "Top" vorhanden
        if regist.ValueExists('Top') then
          Form1.Top := regist.ReadInteger('Top');
      finally
        regist.CloseKey;
      end;
    end;
  finally
    regist.Free;
  end;
end;
Besonderheiten bei Windows NT/2000/XP und neuer
Wie bereits erwähnt, können unter NT-Systemen nur Anwender mit Administrator-Rechten auf den HKEY_LOCAL_MACHINE-Schlüssel der Registry schreibend zugreifen. Wird also in einem Programm der Schreibzugriff auf diesen Schlüssel verwendet, sollte try-except verwendet werden, um ein mögliches Fehlschlagen abzufangen.

Auch das Lesen aus diesem Schlüssel ist unter NT nicht ganz problemlos. Über die oben vorgestellte Möglichkeit versucht Delphi immer, Vollzugriff (lesen und schreiben) zu erlangen. Ist das nicht möglich, weil ein NT-User keine Administrator-Rechte hat, tritt eine Exception auf. Da das Lesen von HKLM jedoch allen NT-Usern möglich ist, müssen wir Delphi klar machen, dass wir in diesem Fall keinen Vollzugriff, sondern nur Lesezugriff wollen. Das geht so:

regist := TRegistry.Create(KEY_READ);

Weitere Möglichkeiten zum Thema Zugriffsrechte sind in der Delphi-Hilfe unter TRegistry.Access zu finden.

Schöne Grüße aus Nürnberg,
Manfred

mz23 6. Mär 2012 07:10

AW: Seriennummer Informationen in Registry schreiben
 
...
Nachschlag:

Laß mal den BackSlash am Ende des Strings in OpenKey weg!

anstatt:
Delphi-Quellcode:

OpenKey('Software\DeveloperName\AppName\', True);
mach mal:

Delphi-Quellcode:

OpenKey('Software\DeveloperName\AppName', True);
auch:

Delphi-Quellcode:

WriteString('S/NR', MainConfig.SENR);
würde ich lieber so probieren:

Delphi-Quellcode:

WriteString('S-NR', MainConfig.SENR);
Schöne Grüße,
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
Seite 4 von 5   « Erste     234 5      

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