Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.08;
Скачать: CL | DM;

Вниз

Помогите с TRegistry.SaveKey   Найти похожие ветки 

 
Barmutik ©   (2002-03-25 18:42) [0]

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

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


 
Anatoly Podgoretsky ©   (2002-03-25 20:17) [1]

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


 
Barmutik ©   (2002-03-26 10:22) [2]

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

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

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 сохранять только в несуществующий(новый) файл и использовал файл без расширения. Ничего не помогает.

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


 
Внук ©   (2002-03-26 12:29) [3]

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

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 18:15) [4]

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

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

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



 
y-soft ©   (2002-03-26 18:47) [5]

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

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


 
Внук ©   (2002-03-26 18:58) [6]

>>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"у.


 
Barmutik ©   (2002-03-26 19:11) [7]

То Внук:

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

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

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

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

To y-soft:

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





 
Anatoly Podgoretsky ©   (2002-03-26 20:51) [8]

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


 
SeF ©   (2002-03-27 03:32) [9]

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


 
y-soft ©   (2002-03-27 09:02) [10]

>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)


 
Внук ©   (2002-03-27 09:25) [11]

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


 
Barmutik ©   (2002-03-27 10:17) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2002.04.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
7-22854
Pasha
2001-09-21 15:44
2002.04.08
Порты в Win2000


14-22796
skywalker
2002-02-26 13:48
2002.04.08
Фортран


4-22876
JAndrey
2002-01-31 01:15
2002.04.08
Как заблокировать клавиатуру и мышь?


3-22570
Siberia
2002-03-12 10:56
2002.04.08
Подскажите как организовать алгоритм


1-22677
snoup
2002-03-26 07:49
2002.04.08
Как сделать так, что бы например по истечению 10 сек. происходило кокоето событие (пример имеется ввиде TTimer)