Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
ВнизПомогите с 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c