страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я

Решение проблем с RegSaveKey

Вот возник на форуме вопрос о том, как пользоваться API-функцией RegSaveKey. Эта функция позволяет сохранить ветку реестра в отдельный файл. Формат у файла получается такой-же как у файлов реестра, т.е. двоичный. Потом этот файл можно использовать для восстановления ветки реестра. В этой же теме используются функции RegSaveKeyEx, RegLoadKey, RegReplaceKey, RegRestoreKey. Delphi-объект TRegistry также имеет подобные методы, но без приставки Reg (организует обертку для этих API функций).
Так вот при использовании RegSaveKey в WIndows XP возникла проблема, либо файл вообще не записывается, или записывается нулевой длины. В WIndows 98 ничего пободного не было. Несколько минут копаний в MSDN решили проблему.
1. TRegistry.SaveKey использует API-функцию RegSaveKey. А она может сохранять ключи только из следующих разделов:

2. RegSaveKey возвращает ошибку если файл с именем, переданным в функцию, уже существует.
3. И самое главное - у программы долна быть привилегия SE_BACKUP_NAME ("SeBackupPrivilege"). Вот код который включает эту привилегию. Обработку ошибок не делал.

function EnableBackupPrivileges: Boolean;
var
  hToken: THandle;
  tp: TTokenPrivileges;
  BackupNameValue: Int64;
  ret: Cardinal;
begin
  Result := False;
  OpenProcessToken(GetCurrentProcess,
                   TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
  LookupPrivilegeValue(nil,'SeBackupPrivilege',BackupNameValue);
  tp.PrivilegeCount := SE_PRIVILEGE_ENABLED_BY_DEFAULT;
  tp.Privileges[0].Luid := BackupNameValue;
  tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  if AdjustTokenPrivileges(hToken,False,tp,
                           sizeof(tp),nil,ret) then
    Result := True;
  CloseHandle(hToken);
end;

Таким образом вот этот код вполне работает под админом, но под простым юзер все равно получается нулевой файл. Видать тоже каких-то прав не хватает.

procedure TForm1.Button1Click(Sender: TObject);
var
  r: TRegistry;
begin
  EnableBackupPrivileges;
  r := TRegistry.Create;
  r.RootKey := HKEY_CURRENT_USER;
  r.SaveKey('Software\Microsoft\Windows\CurrentVersion\Run',
            'autorun.dat');
  r.Free;
end;

Good luck :)
tripsin

Hosted by uCoz