AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Schlüssel aus der Registry exportieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schlüssel aus der Registry exportieren

Ein Thema von Luckie · begonnen am 11. Okt 2002 · letzter Beitrag vom 14. Feb 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Schlüssel aus der Registry exportieren

  Alt 11. Okt 2002, 11:13
Hintergrund: Es hat mich genervt, dass man bei jeder Neuinstallation immer wieder alles neu von hand einstellen muß. (Ich meinE, wozu habe ich denn einen Computer?) Ich habe mich dann etwas damit auseinandergesetzt und von Hand die Schlüssel aus der Regeistry exportiert. Nun wollte ich das automatisieren. Mit Batch-Dateien habe ich es schon hinbekommen, aber die sind sehr unflexible. Ich bin dann auf die API RegSaveKey gestossen.

So mit untenstehenden Code versuche ich nun einen Schlüssel aus der Registry zu exportieren und zu speichern. Das funktioniert so halb. Also die Datei wird erstellt, nur leider bleibt sie leer. Und genau an dieser Stelle bräuchte ich eure Hilfe.

Code:
[b]procedure[/b] ExportRegKey(Path: [b]String[/b]; ID: byte; Root: HKEY);
[b]var[/b]
  hRegKey, dummy: HKEY;
  i: Byte;
  s: [b]String[/b];
[b]begin[/b]
  s := GetSubKey(LoadStr(ID));
  dummy := RegOpenKeyEx(HKEY_CURRENT_USER, @s[1], 0, KEY_READ, hRegKey);
  RegSaveKey(hRegKey, @Path[1], 0);
  RegCloseKey(hRegKey);
[b]end[/b];
Zur Erklärung:
LooadStr(ID) liefert folgenden String:
"HKEY_CURRENT_USER\\Software\\Microsoft\\Inter net Explorer" (Die doppleten "\\" sind in Ordnung, der String kommt aus einem Stringtable mit dem VC erstellt. Die gleichen Strings werden als Tooltips angezeigt und da verschwienden die doppelten "\\".)

GetSubKey(...) liefert für obiges Beispiel "Software\\Microsoft\\Internet Explorer"

Path ist der Pfad und der Dateiname.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 11. Okt 2002, 12:23
So, ich bin einen Schritt weiter. Man muß sich erst die Rechte holen, um das amchen zu können.

Jetzt habe ich auch was in der Datei drin stehen, nur leider unbrauchbaren Mist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3
  Alt 11. Okt 2002, 12:35
Das mit den Rechten steht aber im PSDK.
Eine vergleichbare Funktion gibt´s auch in der "Registry"-Unit (SaveKey), und da ist die Rede von Hive-Dateien. Ich nehme also mal an, der Mist (engl. Nebel ) dürfte eine binäre Kopie des Schlüssels sein, den du sichern wolltest.

Also doch Windows Scripting Host + RegEdit benutzen. 8)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 11. Okt 2002, 12:59
Hat sich alles geklärt. Nach dem ich die Rechte hatte ging es auch. Nur das Dateiformat kann man nicht mit Doppleklick wieder importieren, weil die Regedit ein anderes Dateiformat erwartet und mit den Hive-Dateien nichts anfangen kann. Man muß also RegLoadKey zum Importieren benutzen.

So geht es: (Ist von Nico)
Rechte holen (ist allgemein verwendbar)
Code:
[b]function[/b] SetPrivilege(Privilege: PChar; EnablePrivilege: Boolean;
  out PreviousState: Boolean): DWORD;
[b]var[/b]
  Token: THandle;
  NewState: TTokenPrivileges;
  Luid: TLargeInteger;
  PrevState: TTokenPrivileges;
  Return: DWORD;
[b]begin[/b]
  PreviousState := True;
  [b]if[/b] (GetVersion() > $80000000) [b]then[/b]
    [color=#000080][i]// Win9x [/i][/color]
    Result := ERROR_SUCCESS
  [b]else[/b]
  [b]begin[/b]
    [color=#000080][i]// WinNT [/i][/color]
    [b]if[/b] [b]not[/b] OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) [b]then[/b]
      Result := GetLastError()
    [b]else[/b]
    [b]try[/b]
      [b]if[/b] [b]not[/b] LookupPrivilegeValue([b]nil[/b], Privilege, Luid) [b]then[/b]
        Result := GetLastError()
      [b]else[/b]
      [b]begin[/b]
        NewState.PrivilegeCount := 1;
        NewState.Privileges[0].Luid := Luid;
        [b]if[/b] EnablePrivilege [b]then[/b]
          NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        [b]else[/b]
          NewState.Privileges[0].Attributes := 0;
        [b]if[/b] [b]not[/b] AdjustTokenPrivileges(Token, False, NewState,
          SizeOf(TTokenPrivileges), PrevState, Return) [b]then[/b]
          Result := GetLastError()
        [b]else[/b]
        [b]begin[/b]
          Result := ERROR_SUCCESS;
          PreviousState :=
            (PrevState.Privileges[0].Attributes [b]and[/b] SE_PRIVILEGE_ENABLED <> 0);
        [b]end[/b];
      [b]end[/b];
    [b]finally[/b]
      CloseHandle(Token);
    [b]end[/b];
  [b]end[/b];
[b]end[/b];
Export:
Code:
[b]function[/b] RegSaveKeyToFile(Key: HKEY; [b]const[/b] SubKey, FileName: [b]string[/b]): DWORD;
[b]const[/b]
  SE_BACKUP_NAME = 'SeBackupPrivilege';
[b]var[/b]
  Return: DWORD;
  PreviousState: Boolean;
  KeyHandle: HKEY;
[b]begin[/b]
  Return := SetPrivilege(SE_BACKUP_NAME, True, PreviousState);
  [b]if[/b] (Return <> ERROR_SUCCESS) [b]then[/b]
    Result := Return
  [b]else[/b]
  [b]try[/b]
    KeyHandle := 0;
    Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle);
    [b]if[/b] (Result = ERROR_SUCCESS) [b]then[/b]
    [b]try[/b]
      Result := RegSaveKey(KeyHandle, PChar(FileName), [b]nil[/b]);
    [b]finally[/b]
      RegCloseKey(KeyHandle);
    [b]end[/b];
  [b]finally[/b]
    [b]if[/b] ([b]not[/b] PreviousState) [b]then[/b]
      SetPrivilege(SE_BACKUP_NAME, PreviousState, PreviousState);
  [b]end[/b];
[b]end[/b];
Und Aufruf mit:
Code:
RegsaveKeyToFile(HKEY_CURRENT_USER, GetSubKey(LoadStr(103)), Path);
Zu beachten: Falls dier Datei schon besteht, muß sie vorher gelöscht werden!

Hm, wenn ich mir das so ankucken, auf dem richtigen Weg war ich, nur waren meine Funktionen nicht so ausgefeilt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
n3m0

Registriert seit: 15. Dez 2002
10 Beiträge
 
#5
  Alt 15. Dez 2002, 15:41
Hallo an alle!

wie ihr seht bin ich auch erst heute hier "reingestolpert"
und mir gefällt das forum echt auf anhieb!
bin über ne google suche drauf gestoßen *schäm*

aber um auf mein eigentliches anliegen zu kommen,
was dann auch begründet warum ich mein erstes posting
hier in diesen thread schreibe:

ich wollte einen vorhandenen reg-schlüssel als hive
in einer datei speichern und anschliessend laden.

dies habe ich zuerst mit den standard delphi funktionen
probiert (savekey,loadkey, etc.) aber irgendwie hat
das nicht zu den gewünschten erfolgen geführt also hab ich
mal nen bissel im i-net gestöbert und hab dann schliesslich
(wie oben schon erwähnt) diesen thread hier gefunden.

die frage nach den privileges leuchtet mit im nachhinein
auch ein *G* aber dennoch hab ich noch das ein oder andere problem:

Code:
RegsaveKeyToFile(HKEY_CURRENT_USER, GetSubKey(LoadStr(103)), Path);
Dabei kennt mein delphi (hab 3.0 und 7.0) die funktion GetSubKey
nicht. da ich echt bisher null ahung von der benutzung des psdk
hab (die ich mir aber in diesem augenblick downloade )
weiss ich nicht so richtig woher ich diese funktion bekommen?!

wäre echt nett wenn ihr mir als neuling ein klein wenig unter die
arme greifen könntet

ciao n3m0
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6
  Alt 15. Dez 2002, 18:11
Luckie hat in seinem ersten Posting erklärt (bzw. ich vermute das jetzt einfach mal), dass es sich bei "GetSubKey" um eine eigene Funktion handelt, die er geschrieben hat.

Die brauchst du auch nicht. Im Prinzip übergibst du nur den Root, den gewünschten Schlüsselnamen und den Dateinamen, etwa:
Code:
RegSaveKeyToFile(HKEY_CURRENT_USER,
  'Software\Microsoft\Windows',
  'c:\lastcrap\test.hive');
  Mit Zitat antworten Zitat
n3m0

Registriert seit: 15. Dez 2002
10 Beiträge
 
#7
  Alt 15. Dez 2002, 22:09
ah thx!

Zitat:
GetSubKey(...) liefert für obiges Beispiel "Software\\Microsoft\\Internet Explorer"

Path ist der Pfad und der Dateiname.
ich hatte das nicht so ganz richtig verstanden!
also das es sich um eine eigene funktion handelt!

ich werds gleichmal probieren!


-------EDIT------

es funzt! thx für die schnelle hilfe nochmal!
  Mit Zitat antworten Zitat
n3m0

Registriert seit: 15. Dez 2002
10 Beiträge
 
#8
  Alt 17. Dez 2002, 12:09
menno.

es wurmt mich ein bischen das ich nicht selber auf die lösung kommen, aber ich brauche nochmal eure hilfe!

ich habe versucht die zugehörige RegLoadKey Function zu erstellen,
was in erster linie kopierarbeit war:

Code:
function RegLoadKeyFromFile(Key: HKEY; const SubKey, FileName: string): DWORD;
const
  SE_RESTORE_NAME = 'SeRestorePrivilege';
var
  Return: DWORD;
  PreviousState: Boolean;
  KeyHandle: HKEY;
begin
  Return := SetPrivilege(SE_RESTORE_NAME, True, PreviousState);
  if (Return <> ERROR_SUCCESS) then
    Result := Return
  else
  try
    KeyHandle := 0;
    Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle);
    if (Result = ERROR_SUCCESS) then
    try
      Result := RegLoadKey(Key,PChar(Subkey), PChar(FileName),);
    finally
      RegCloseKey(KeyHandle);
    end;
  finally
    if (not PreviousState) then
      SetPrivilege(SE_RESTORE_NAME, PreviousState, PreviousState);
  end;
end;
als kommentar dazu sollte man noch sagen, dasi ch noch RegOpenKeyEx benutzt habe nur um zu testen RegCreateKeyEx hätte ich später eingebaut. Damit es trotzdem problemlos läuft hab ich als subkey natürlich einen spezifiziert, der bereits in der registry vorhanden ist! der Fehler muss meiner meinung nach bei den privileges liegen! ich bekommen den fehler ERROR_ACCESS_DENIED (5) zurück wenn die RegLoadKey ausgeführt wird.

@Luckie: du hast die LoadKey funktion doch bestimmt schon erstellt! bitte hilf mir ich weiss net weiter

bye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9
  Alt 17. Dez 2002, 12:19
Hier mal mein Tool, um Registry Schlüssel zu exportieren. Es ist aber nue fertig geworde, da ich Probleme mit dem wieder Eintragen hatte, die ich bisher nicht lösen konnte.

Es war nur für den persönlichen Gebrauch gedacht, um nach einer neu Installation nicht wieder alles von Hand einstelln zu müssen.

Archiv im Anhang.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
n3m0

Registriert seit: 15. Dez 2002
10 Beiträge
 
#10
  Alt 17. Dez 2002, 13:41
thx @Lucki!

bisher konnte ich nur zwei unterschiede zu meinem quelltext
feststellen, also in der procedure RegLoadKeyFromFile und
zwar diese zeilen:

Code:
Return := SetPrivilege(SE_BACKUP_NAME, True, PreviousState);
Code:
SetPrivilege(SE_BACKUP_NAME, PreviousState, PreviousState);
ich habe sie ergänzt, bzw geändert jedoch ohne das das irgend
einen erfolg mit sich gebracht hätte .. :/
evtl hab ich nochwas wichtiges in deinem programm übersehen.
ich werd nochmal durchschauen!

trotzdem danke nochmal!

-------------EDIT---------------

BUAH, ich depp man, hab grad nen echt langen edit beitrag geschrieben,
dann kam ne private message und ich hab draufgeklickt und zack
beitrag weg (

also nochmal aber diesmal in kurzform:

Ich hab mir deinen quelltext durchgelesen, kann jedoch zu
meiner funktionsweise sowohl im inneren der proceduren / Funktionen
als auch in den schnittstellen keine unterschiede feststellen.
ich habe jedoch nen fehler in deinen code gefunden, wenn mich
nicht alles täuscht:

Code:
....
         for i := 102 to 109 do
          begin
            if SendDlgItemMessage(hApp, i, BM_GETCHECK,0,0) = BST_CHECKED then
            begin
              ....
              dwResult := RegSaveKeyToFile(HKEY_CURRENT_USER, Subkey, Path);
              ....
            end;
          end;
          for i := 110 to 111 do
          begin
            if SendDlgItemMessage(hApp, i, BM_GETCHECK,0,0) = BST_CHECKED then
            begin
              ....
              dwResult := RegSaveKeyToFile(HKEY_LOCAL_MACHINE, Subkey, Path);
              ....
            end;
          end;
        end;
        IDC_BTN_IMPORT:
        begin
          for i := 102 to 109 do
          begin
            if SendDlgItemMessage(hApp, i, BM_GETCHECK,0,0) = BST_CHECKED then
            begin
              ....
              dwResult := RegLoadKeyFromFile(HKEY_CURRENT_USER, Subkey, Path);
              ....
            end;
          end;
          for i := 110 to 111 do
          begin
            if SendDlgItemMessage(hApp, i, BM_GETCHECK,0,0) = BST_CHECKED then
            begin
              ....
              if FileExists(Path) then
                DeleteFile(@Path[1]);
              ....
              dwResult := RegSaveKeyToFile(HKEY_LOCAL_MACHINE, Subkey, Path);
              ....
            end;
          end;
Da es sich in der untersten for-to-do schleife um eine schleife
zum Importieren handelt, müsste die Anweisung heissen "RegLoadKeyFromFile".

auch die if-abfrage müsste dann noch geändert werden:
Code:
              if FileExists(Path) = FALSE then
                RaiseLastError(hApp);
aber weiter bin ich trotzdem noch nicht

bye philipp
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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