Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как экспортировать целиком ветвь реестра


Автор: BeeMaster 5.4.2008, 15:24
Подскажите пожалуйста как это можно реализовать. Гугл молчит по этому вопросу по этому решил написать сюда.

Дайте пример т.к я совсем новичок и почти в этом не разбераюсь =)))

Автор: Alexeis 5.4.2008, 16:05
  Думаю RegSaveKey то что нужно smile .

Автор: BeeMaster 5.4.2008, 16:18
А можно пример?

Автор: Alexeis 5.4.2008, 17:25
Код

const SE_BACKUP_NAME ='SeBackupPrivilege';

procedure TForm1.FormCreate(Sender: TObject);
var
  hToken : THandle;
  luid   : TLargeInteger;
  tp     : TOKEN_PRIVILEGES;
  retlen : Cardinal;
  key    : HKEY;
  r      : Integer;
begin
  if not OpenProcessToken(GetCurrentProcess(),
                      TOKEN_ADJUST_PRIVILEGES,
                      hToken )
  then
    Begin
      ShowMessage('OpenProcessToken ' + IntToStr(GetLastError()));
      exit;
    end;

  if not LookupPrivilegeValue(nil, SE_BACKUP_NAME, luid)
  then
    begin
      ShowMessage('LookupPrivilegeValue' + IntToStr(GetLastError()));
      exit;
    end;

  tp.PrivilegeCount           := 1;
  tp.Privileges[0].Luid       := luid;
  tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

  AdjustTokenPrivileges(hToken, false, tp, sizeof(TOKEN_PRIVILEGES), nil, retlen);

  if (GetLastError() = ERROR_NOT_ALL_ASSIGNED)
  then
    Begin
      ShowMessage('The token does not have the specified privilege.');
    end;

  r := RegOpenKey(HKEY_CURRENT_USER, 'Software', key);
  r := RegSaveKey(key, 'C:\1.reg', nil);
  RegCloseKey(key);

  AdjustTokenPrivileges( hToken, true, PTokenPrivileges(nil)^, 0, nil, retlen);

  CloseHandle(hToken);
end;



Добавлено @ 17:36
 Еще такой вариант есть с использованием Regedit

Код

WinExec('regedit /e C:\RegData.reg HKEY_LOCAL_MACHINE\Software', SW_SHOW);


Да и еще тут есть http://forum.vingrad.ru/index.php?show_type=forum&showtopic=53881 почти такой же пример как я привел. Плохо искал...

Автор: BeeMaster 5.4.2008, 18:33
Код

const SE_BACKUP_NAME ='SeBackupPrivilege';
procedure TForm1.FormCreate(Sender: TObject);
var
  hToken : THandle;
  luid   : TLargeInteger;
  tp     : TOKEN_PRIVILEGES;
  retlen : Cardinal;
  key    : HKEY;
  r      : Integer;
begin
  if not OpenProcessToken(GetCurrentProcess(),
                      TOKEN_ADJUST_PRIVILEGES,
                      hToken )
  then
    Begin
      ShowMessage('OpenProcessToken ' + IntToStr(GetLastError()));
      exit;
    end;
  if not LookupPrivilegeValue(nil, SE_BACKUP_NAME, luid)
  then
    begin
      ShowMessage('LookupPrivilegeValue' + IntToStr(GetLastError()));
      exit;
    end;
  tp.PrivilegeCount           := 1;
  tp.Privileges[0].Luid       := luid;
  tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, false, tp, sizeof(TOKEN_PRIVILEGES), nil, retlen);
  if (GetLastError() = ERROR_NOT_ALL_ASSIGNED)
  then
    Begin
      ShowMessage('The token does not have the specified privilege.');
    end;
  r := RegOpenKey(HKEY_CURRENT_USER, 'Software', key);
  r := RegSaveKey(key, 'C:\1.reg', nil);
  RegCloseKey(key);
  AdjustTokenPrivileges( hToken, true, nil, 0, nil, retlen);
  CloseHandle(hToken);
end;

Он выдает ошибку и кричит delphi на строку AdjustTokenPrivileges( hToken, true, nil, 0, nil, retlen); а если её удалить то файл получается нечитаемый

Код

WinExec('regedit /e C:\RegData.reg HKEY_LOCAL_MACHINE\Software', SW_SHOW);

Тут проблемма. Если в реестре есть пробел то она перестает работать. Пример: HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager

А с http://forum.vingrad.ru/index.php?show_typ...showtopic=53881 вообще я не понял как работать=(



У кого есть предложения?

Добавлено через 6 минут и 13 секунд
А можно сделать так.

Скопирывать HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager (должна остаться) и сохранить HKEY_CURRENT_USER\Software\Microsoft\123456 потом воспользоваться WinExec('regedit /e C:\RegData.reg HKEY_CURRENT_USER\Software\Microsoft\123456', SW_SHOW); и потом удалить HKEY_CURRENT_USER\Software\Microsoft\123456    .


 smile 

Автор: Alexeis 5.4.2008, 19:00
Цитата(BeeMaster @  5.4.2008,  17:33 Найти цитируемый пост)
Он выдает ошибку и кричит delphi на строку AdjustTokenPrivileges( hToken, true, nil, 0, nil, retlen); а если её удалить то файл получается нечитаемый

А ну да точно тут должно быть так  
AdjustTokenPrivileges( hToken, true, PTokenPrivileges(nil)^, 0, nil, retlen);

Теперь на счет нечитабельности, кто сказал что файл должен быть читабельный? Сам открывал хоть раз файл реестра блокнотом? Там что-то типа базы данных, так что не читабельный еще не значит что сохранение прошло неправильно. На самом деле там все правильно, просто не для блокнота сделано.

На счет WinExec('regedit /e C:\RegData.reg HKEY_LOCAL_MACHINE\Software', SW_SHOW);

Пути с пробелами принято брать в двойные кавычки, например так 
Код

WinExec('regedit /e C:\RegData.reg "HKEY_LOCAL_MACHINE\Software"', SW_SHOW);



Автор: BeeMaster 5.4.2008, 19:23
За это отдельное спасибо
Код

WinExec('regedit /e C:\RegData.reg "HKEY_LOCAL_MACHINE\Software"', SW_SHOW);


<<<Теперь на счет нечитабельности, кто сказал что файл должен быть читабельный? Сам открывал хоть раз файл реестра блокнотом? Там что-то типа базы данных, так что не читабельный еще не значит что сохранение прошло неправильно. На самом деле там все правильно, просто не для блокнота сделано.


На счет этого. Я знаю как должна была выгледить запись. Но она действительно нечитаемая было потому что в блокноте смотрел.


Пасиб за помощь  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)