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
 
NicoDE
(Gast)

n/a Beiträge
 
#24

Re: Schlüssel aus der Registry exportieren

  Alt 13. Feb 2004, 02:19
Zitat von mbs:
Hat jemand von Euch eine Lösung für das Problem mit dem Wiederherstellen gefunden?
Hier ist ein erster Ansatz (nicht mehr und nicht weniger - keine Zeit)...
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;
  Mit Zitat antworten Zitat
 


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 06:20 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 by Thomas Breitkreuz