Вот возник на форуме вопрос о том, как пользоваться 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