![]() |
Schlüssel aus der Registry exportieren
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:
Zur Erklärung:
[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]; 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. |
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. |
Das mit den Rechten steht aber im PSDK. :roll:
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 :wink:) dürfte eine binäre Kopie des Schlüssels sein, den du sichern wolltest. Also doch Windows Scripting Host + RegEdit benutzen. 8) |
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:
Export:
[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];
Code:
Und Aufruf mit:
[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];
Code:
Zu beachten: Falls dier Datei schon besteht, muß sie vorher gelöscht werden!
RegsaveKeyToFile(HKEY_CURRENT_USER, GetSubKey(LoadStr(103)), Path);
Hm, wenn ich mir das so ankucken, auf dem richtigen Weg war ich, nur waren meine Funktionen nicht so ausgefeilt. |
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* :P 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:
Dabei kennt mein delphi (hab 3.0 und 7.0) die funktion GetSubKey
RegsaveKeyToFile(HKEY_CURRENT_USER, GetSubKey(LoadStr(103)), Path);
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 |
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'); |
ah thx!
Zitat:
also das es sich um eine eigene funktion handelt! ich werds gleichmal probieren! -------EDIT------ es funzt! thx für die schnelle hilfe nochmal! |
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:
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.
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; @Luckie: du hast die LoadKey funktion doch bestimmt schon erstellt! bitte hilf mir ich weiss net weiter :) bye |
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. |
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:
ich habe sie ergänzt, bzw geändert jedoch ohne das das irgend
SetPrivilege(SE_BACKUP_NAME, PreviousState, PreviousState);
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:
Da es sich in der untersten for-to-do schleife um eine schleife
....
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; zum Importieren handelt, müsste die Anweisung heissen "RegLoadKeyFromFile". auch die if-abfrage müsste dann noch geändert werden:
Code:
aber weiter bin ich trotzdem noch nicht :(
if FileExists(Path) = FALSE then
RaiseLastError(hApp); bye philipp |
Mist, wenn ich nur editiere sieht man in der Übersicht garnicht
das sich was geändert hat. |
Öhm, ja aber. Das war nicht das Problem.
|
jo das ist echt nicht das problem :(
lübbt immer noch net, kann ich dir evtl mal meinen source zeigen damit du man guggn kannst? |
Ich kann auch nicht mehr machen, als deinen Source mit meinem vergleichen.
|
das ist richtig, aber da meine erfahrungen eigetnlich
minimal sind und deine nicht kann es ja sein das ich nen banalen fehler gemacht hab. evtl kannste ja die exe testen und vielleicht geht dir nur bei mir nicht, obwohl mich das irgendwie wundern würde :) |
OK, häng sie mal an. Ich habe allerdings gerade zu tun. Kann 20 Uhr werden.
|
thx alot!
ich bin eh nicht vor 4 zu hause :D gleich gehts ins herr der ringe double feature! man ich bin so dermaßen aufgeregt !! bis später philipp |
Depp. Du sollst dein Programm inklusive Code an den beitrag hängen. Es ist mir doch egal ob du vor Rechner sitz ode rmit deiner Freundin im Kino rumknutschst. Wärend du im Kino bist hätte ich ja schon mal dran arbeiten können und wenn du dann wiedergekommen wärst, hättest du eventuell schon ein Ergerbnis.
[Edit=FuckRacism]Doppelpost gelöscht; So wichtig isch es auch nun wieder nicht :mrgreen: [/Edit] |
Zitat:
sehr schade das du es nicht gesehen hast. aber wäre nett wenn du das depp zurücknehmen würdest! guck mal auf seite 1 letztes posting. inhalt: Zitat:
und jetzt mal was da im anhang ist .. bye philipp |
Ok, den Depp nehme ich zurück. Habe ich einfach nicht gesehen.
Das Exportieren geht doch. Wo war jetzt das Problem? Beim Importieren kann ich dir im Moment auch nicht helfen, weil ich da auch stecken geblieben bin. Btw. ist der Code ja mit meinem identisch. :wink: @FuckRascism: Beim ersten Abschicken, kam ein Database-Error und habe dann icht gemerkt, dass es beim zweiten mal schon da war. |
ahso das importieren geht bei dir nicht?
ich dachte das würde bei dir funktionieren, hatte ich aus deiner formulierung irgendwie so verstanden .. dann is ja ok bzw eigetnlich ja nicht aber immerhin hab ich keinen dummen fehler gemacht, hm, aber ist wirklich sehr verwunderlich das das nicht geht, weil in der delphi hilfe steht das man SE_RESTORE.. braucht um in die reg laden zu können, aber der access ist denied :/ mal schauen, dann werd ich halt nochn bissel basteln *G* falls du ne lösungen finden solltest wäre nett wenn du sie hier posten könntest! philipp |
Re: Schlüssel aus der Registry exportieren
Monate später, nämlich erst heute, habe ich diese Diskussion gelesen.
Leider funktioniert die Funktion RegLoadKeyFromFile bei mir nicht in der Form, in der sie hier angeboten wird. Und Anhänge sind scheinbar nicht mehr vorhanden... Kann mir jemand eine funktionierende RegLoadKeyFromFile zukommen lassen? RegSaveKeyToFile funktioniert problemlos. |
Re: Schlüssel aus der Registry exportieren
Hi!
Hat jemand von Euch eine Lösung für das Problem mit dem Wiederherstellen gefunden? Es muss doch irgendwie gehen. ... Ich nehme die Sicherung mit Reg.SaveKey aus der Registry-Unit vor, nachdem ich mit SeBackupPrivilege geholt habe. Dann will ich mittels SeRestorePrivilege und Reg.LoadKey bzw. Reg.RestoreKey einen Schlüssel wiederherstellen. Aber das schlägt fehl. Hat jemand eine Lösung / Idee? |
Re: Schlüssel aus der Registry exportieren
Zitat:
Fallstricke: - unter NT RegRestoreKey, unter 9x RegLoadKey - unter 9x nur kurze Dateinamen (8.3) - aktuelle MSDN lesen (wenn nötig nochmal)
Delphi-Quellcode:
function SetPrivilege(Privilege: PChar; EnablePrivilege: Boolean;
out PreviousState: Boolean): DWORD; var Token: THandle; NewState: TTokenPrivileges; Luid: TLargeInteger; PrevState: TTokenPrivileges; Return: DWORD; begin PreviousState := True; if (GetVersion() > $80000000) then // Win9x Result := ERROR_SUCCESS else begin // WinNT if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then Result := GetLastError() else try if not LookupPrivilegeValue(nil, Privilege, Luid) then Result := GetLastError() else begin NewState.PrivilegeCount := 1; NewState.Privileges[0].Luid := Luid; if EnablePrivilege then NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else NewState.Privileges[0].Attributes := 0; if not AdjustTokenPrivileges(Token, False, NewState, SizeOf(TTokenPrivileges), PrevState, Return) then Result := GetLastError() else begin Result := ERROR_SUCCESS; PreviousState := (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0); end; end; finally CloseHandle(Token); end; end; end; function RegSaveKeyToFile(Key: HKEY; const SubKey, FileName: string): DWORD; const SE_BACKUP_NAME = 'SeBackupPrivilege'; var PreviousState: Boolean; KeyHandle: HKEY; begin Result := SetPrivilege(SE_BACKUP_NAME, True, PreviousState); if (Result = ERROR_SUCCESS) then try KeyHandle := 0; Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle); if (Result = ERROR_SUCCESS) then try // FIXME: Short Filename on Win9x! Result := RegSaveKey(KeyHandle, PChar(FileName), nil); finally RegCloseKey(KeyHandle); end; finally if (not PreviousState) then SetPrivilege(SE_BACKUP_NAME, PreviousState, PreviousState); end; end; function RegLoadKeyFromFile(Key: HKEY; const SubKey, Filename: string): DWORD; const SE_BACKUP_NAME = 'SeBackupPrivilege'; SE_RESTORE_NAME = 'SeRestorePrivilege'; var PrevBackup: Boolean; PrevRestore: Boolean; KeyHandle: HKEY; ShortName: array [0..MAX_PATH] of Char; begin Result := SetPrivilege(SE_BACKUP_NAME, True, PrevBackup); if (Result = ERROR_SUCCESS) then try Result := SetPrivilege(SE_RESTORE_NAME, True, PrevRestore); if (Result = ERROR_SUCCESS) then try if (GetVersion() > $80000000) then begin // Win9x (FIXME: Test it! - and see RegReplaceKey) if (GetShortPathName(PChar(Filename), ShortName, MAX_PATH) = 0) then Result := GetLastError() else Result := RegLoadKey(Key, PChar(SubKey), ShortName); end else begin // WinNT (FIXME: Load RegRestoreKey dynamically!) KeyHandle := 0; Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle); if (Result = ERROR_SUCCESS) then try Result := RegRestoreKey(KeyHandle, PChar(Filename), 0); finally RegCloseKey(KeyHandle); end; end; finally if (not PrevRestore) then SetPrivilege(SE_RESTORE_NAME, PrevRestore, PrevRestore); end; finally if (not PrevBackup) then SetPrivilege(SE_BACKUP_NAME, PrevBackup, PrevBackup); end; end; //////////////////////////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); const Key = HKEY(HKEY_LOCAL_MACHINE); SubKey = 'SOFTWARE\Borland\Locales'; var Filename: string; ErrorCode: DWORD; begin SetLength(Filename, MAX_PATH + 1); SetLength(Filename, GetTempPath(MAX_PATH, PChar(Filename))); Filename := Filename + 'Locales.dat'; ErrorCode := RegSaveKeyToFile(Key, SubKey, Filename); if (ErrorCode <> ERROR_SUCCESS) then ShowMessage('Save: ' + SysErrorMessage(ErrorCode)) else begin ErrorCode := RegLoadKeyFromFile(Key, SubKey, Filename); if (ErrorCode <> ERROR_SUCCESS) then ShowMessage('Load: ' + SysErrorMessage(ErrorCode)) else ShowMessage(IntToStr(42)); end; DeleteFile(Filename); end; |
Re: Schlüssel aus der Registry exportieren
Vielen Dank. Ich lese die MSDN dann wohl nachträglich noch einmal. Irgendwie hatte ich eben immer versucht, beim Wiederherstellen nur SeRestorePrivelege zu bekommen.. Na, ja. Danke!!!
|
Re: Schlüssel aus der Registry exportieren
Tss tss, ein Mod, der eine beantwortete Frage als offen läßt ... tss tss
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz