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


Автор: gm44 13.1.2010, 20:28
Не работает восстановление из файла. Делаю под админом, ошибки не выдает, но восстановление не работает.

Код, который сохранит ветку реестра в файл:
============
Код

var
   hToken: THandle;
   tkp: Token_Privileges;
   ReturnLength: Cardinal;
   hKeyToSave: HKEY;
   dw: cardinal;
begin
 if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken) then
  begin
   LookupPrivilegeValue(nil,'SeBackupPrivilege', tkp.Privileges[0].Luid);
   tkp.PrivilegeCount:=1;

   tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, false, tkp, sizeof(TOKEN_PRIVILEGES), nil, ReturnLength);
   end;

 RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                    'SOFTWARE',//ключ, который бэкапим
                    0,
                    nil,
                    REG_OPTION_BACKUP_RESTORE,
                    KEY_QUERY_VALUE,
                    nil,
                    hKeyToSave,
                    @dw);

 RegSaveKey(hKeyToSave,'имя_файла_в_который_бэкапим.txt', nil);
 RegCloseKey(hKeyToSave);
end;
=========================
код, совершающий восстановление из файла :
var
   hToken: THandle;
   tkp: Token_Privileges;
   ReturnLength: Cardinal;
   hKeyToSave: HKEY;
   dw: cardinal;
begin
 if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken) then
  begin
   LookupPrivilegeValue(nil,'SeRestorePrivilege', tkp.Privileges[0].Luid);
   tkp.PrivilegeCount:=1;

   tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, false, tkp, sizeof(TOKEN_PRIVILEGES), nil, ReturnLength);
   end;

 RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                    'SOFTWARE',//ключ, который бэкапим
                    0,
                    nil,
                    REG_OPTION_BACKUP_RESTORE,
                    KEY_QUERY_VALUE,
                    nil,
                    hKeyToSave,
                    @dw);

 RegLoadKey(hKeyToSave,'имя_файла_в_который_бэкапим.txt', nil);
 RegCloseKey(hKeyToSave);
end;


M
Rrader
Пользуйтесь подсветкой кода!

Автор: Демо 13.1.2010, 21:32
gm44, 
Из утилиты Regedit пробовал то же самое проделать?

Автор: gm44 13.1.2010, 22:06
Пробовал. Через Regedit нормально отрабатывает. Думаю с кодом проблема...

Автор: Демо 13.1.2010, 22:15
В наше время нужно бы ещё версию ОС писать и разрядность-)

Автор: gm44 13.1.2010, 22:26
Windows XP SP3 32бит

Автор: Демо 13.1.2010, 23:05
Код

The calling process must have the SE_RESTORE_NAME and SE_BACKUP_NAME privileges on the computer in which the registry resides. 


Добавлено через 2 минуты и 57 секунд
Вот ещё:
http://support.microsoft.com/kb/257176

Автор: gm44 14.1.2010, 00:05
У меня с английским туго. Но если я правильно перевел, то написано что нужно дать привилегии REG_OPTION_BACKUP_RESTORE. Но я и так вроде устанавливаю эти привилегии? Или я неправильно понял?

Автор: Демо 14.1.2010, 00:53
Цитата(gm44 @  14.1.2010,  00:05 Найти цитируемый пост)
REG_OPTION_BACKUP_RESTORE



При получении привилегий с помощью AdjustTokenPrivileges:

Цитата(Демо @  13.1.2010,  23:05 Найти цитируемый пост)
SE_RESTORE_NAME and SE_BACKUP_NAME 


Автор: gm44 14.1.2010, 22:39
Спасибо! Работает.

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