Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с TRegistry.SaveKey [D5, Win2k]


Barmutik ©   (2002-03-25 18:42:00) 

Пытаюсь сохранить кусок своего реестра в файл для последующего использования. На все мои попытки вызвать эту функцию вываливается только результат False и создаётся файл нулевого размера.

Подскажите что делать.. Может я чего забыл ?


Barmutik   (2002-03-27 10:17:00) [1]

Спасибо всем кто отозвался и помог !


Внук   (2002-03-27 09:25:00) [2]

>>Barmutik ©
Просто побродить по Help"y - это, конечно, совсем никакой совет. Но я ведь указал направление поиска. Ваши слова "Я прочитал про SE_BACKUP_NAME. Также просмотрел ссылку по привилегиям." - тому доказательство. Но жаль, что до конца не разобрались, получили все-таки готовый ответ в виде кода.
Впрочем, хочется верить, что Вы на меня не в обиде. Форум-то не без добрых людей :)))


y-soft   (2002-03-27 09:02:00) [3]

>Barmutik

1.Вариант использования Regedit привел SeF
2.Порядок получения привилегий следующий:

var
TokenHandle : THandle;
ProcId : DWORD;
Priv, Dummy : TOKEN_PRIVILEGES;
Ver : TOSVERSIONINFO;
const
SE_BACKUP_NAME = "SeBackupPrivilege";
begin
Ver.dwOSVersionInfoSize := Sizeof(Ver);
GetVersionEx(Ver);
if Ver.dwPlatformId = VER_PLATFORM_WIN32_NT then
begin
ProcID := 0;
if (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, TokenHandle)) and
(LookupPrivilegeValue(nil, SE_BACKUP_NAME, Priv.Privileges[0].Luid))
then
begin
Priv.PrivilegeCount := 1;
Priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(TokenHandle, False, Priv, SizeOf(Dummy),
Dummy, ProcId) then
raise Exception.Create(SysErrorMessage(GetLastError));
end
else
raise Exception.Create(SysErrorMessage(GetLastError));
end;
//А здесь поместите код работы с реестром
end;


После этого Microsoft настоятельно рекомендует полученные привилегии аналогичным образом возвратить (установить SE_PRIVILEGE_DISABLED)


SeF   (2002-03-27 03:32:00) [4]

выполни комманду:
regedit /e имя_файла полный_путь_в_реестре_до_нужного_ключа
например:
regedit /e software_hklm.reg HKEY_LOCAL_MACHINE\SOFTWARE


Anatoly Podgoretsky   (2002-03-26 20:51:00) [5]

Ответь на такой вопрос, а с помощью regedit ты можещь сохоанить тот же самы ключ в тоже самое место?
Если можешь, то надо разбираться с кодом, если нет то с правами.


Barmutik   (2002-03-26 19:11:00) [6]

То Внук:

Прочитав Ваш первоначальный ответ я залез в хелп и прочитал про
RegSaveKey. Я прочитал про SE_BACKUP_NAME. Также просмотрел ссылку про привилегиям.

Не поленился и просмотрел код TRegistry.SaveKey.. Да там всё до безобразия понятно. Этот метод вызывают API-шную функцию.

Ещё вчера я не поленился и запустил это кусочек под Win95 и там проблем не возникло, но не если Вы можете заметить то мой вопрос относится имеено к Win2000.

Насчёт метода отсева халявщиков: возможно это конечно и классно,
но если подойти по-другому я же прошу Вас писать за меня то что мне нужно а дать конкретный ответ к коим Ваш совет "побродить по хелпу не относится".

To y-soft:

Если не трудно варианты получения привелегий для возможности копирования куска реестра в файл.




Внук   (2002-03-26 18:58:00) [7]

>>Barmutik ©
Не дал, верно :) Я готовые куски кода редко даю, это мой метод отсева халявщиков. Вы правы насчет KEY_ALL_ACCESS, он здесь не обязателен, поскольку устанавливается в конструкторе, это моя привычка явного контроля за всеми мелочами.
Но... повторяю - смотрите исходники, а они для TRegistry на удивление прозрачны. Переписав Ваш код на API, получим то, что на самом деле делает TRegistry:

var Err:integer;
Hndl:HKEY;
begin
Err:=RegOpenKeyEx(HKEY_CURRENT_USER,PChar("Что-нибудь"),0,KEY_ALL_ACCESS,Hndl);
ShowMessage(SysErrorMessage(Err));
Err:=RegSaveKey(Hndl,"Test",nil);
ShowMessage(SysErrorMessage(Err));
...
end;
Здесь видно, что операция открытия ключа проходит успешно, а на операции экспорта выдается сообщение - недостаточно прав. Причем, я уверен, под Windows95 Ваш первоначальный код будет работать - попробуйте.
Далее - смотрим описание функции RegSaveKey и видим: The calling process must have the SE_BACKUP_NAME privilege. Это справедливо только для линии WinNT. Дальше попробуйте сами побродить по Help"у.


y-soft   (2002-03-26 18:47:00) [8]

Есть 2 варианта:

1. Получить необходимые привилегии
2. Использовать ключики командной строки Regedit.exe


Barmutik   (2002-03-26 18:15:00) [9]

Ну так и результат каков ? Ты не дал ответа на вопрос !

А насчёт KEY_ALL_ACCESS так в хелпе по SaveKey написано что он открывает указанный для записи ключ именно с такими правами.

Люди помогите ! Я по-прежнему в поиске ответа !


Внук   (2002-03-26 12:29:00) [10]

Создание пустого файла наталкивает на мысль, что недостаточно прав на выполнение операции. И действительно, немного исправив приведенный здесь код его эквивалентом (см. исходники):

var MyRegistry: TRegistry;
SaveError:integer;
begin
MyRegistry:=TRegistry.Create;
MyRegistry.Access:=KEY_ALL_ACCESS;
SaveError:=RegSaveKey(HKEY_LOCAL_MACHINE,"Test",nil);
ShowMessage(SysErrorMessage(SaveError));
MyRegistry.Free;
end;

получим в результате сообщение: клиент не обладает требуемыми правами :-)


Barmutik   (2002-03-26 10:22:00) [11]

:) Хооший комментарий !

Приведу кусок кода, может поможет:

var
MyRegistry: TRegistry;
begin
MyRegistry := TRegistry.Create;
try
MyRegistry.RootKey := HKEY_CURRENT_USER;
if not MyRegistry.SaveKey"Software\XXXXX\XXXX",
"C:\1.reg") then
begin
MessageDlg("Can"t save a registry to file", mtError,
[mbOK], 0);
end;
finally
MyRegistry.Free;
end;

И что бы я не делал сохранение никогда не проходит. Создаётся файл нулевого размера. Указанный ключ точно существует. Читал в хелпе что необходимо под FAT сохранять только в несуществующий(новый) файл и использовал файл без расширения. Ничего не помогает.

Подскажите что делать.. Только плиз реальный комментарий...


Anatoly Podgoretsky   (2002-03-25 20:17:00) [12]

Наверно что то забыл.


Наверх

Титульная страница Поиск, карта сайта Написать письмо