![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реестр, не проходит функция, ХЕЛП. [D5, WinXP]
madmike © (2002-07-18 11:01:00)Вот это не работает, пробовал под ХРенью, 98се на Дел5, в чем дело ? хез:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
registry, Dialogs, StdCtrls;
const
sub: string="software\";
var
Form1: TForm1;
reg:TRegistry;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey(sub,true);
if (not reg.SaveKey(sub,"c:\registr.reg")) then
begin
showmessage("error");
reg.free;
application.terminate;
end;
reg.free;
end;
end.
madmike (2002-07-31 01:25:00) [1]2 Внук
Ай-ай-ай! Спасибо, я должник!
Внук (2002-07-30 18:45:00) [2]>>Digitman © Прошу прощения, что вмешиваюсь...
>>madmike © Получение привилегии (код не мой):
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;
madmike (2002-07-30 17:00:00) [3]2 Digitman
Я понял, что мне нужно выполнить какое-то разрешение на сохранение реестра(может действует и не только на реестр), в хелпе говорится о функциях RegGetKeySecurity(), RegSetKeySecurity(), т.е. с помощью них можно что-то узнать(о правах, безопасности) и установить права. Так вот мне необходимо перед операцией сохранения ветки реестра эту процедуру разрешить. Вопрос: Как?
Digitman (2002-07-30 16:13:00) [4]Так давай по каждому "хрену" в вышеозначенном "нихрена"-списке отдельно беседовать)... Задавай вопрос по очередному непонятному "хрену" - постараюсь ответить "нехреново" ...
madmike (2002-07-30 14:52:00) [5]см. API-ф-ции :
RegGetKeySecurity(), RegSetKeySecurity()
Читал. Нихрена не могу понять, не силён я... :(
Digitman (2002-07-30 13:51:00) [6]см. API-ф-ции :
RegGetKeySecurity(), RegSetKeySecurity()
madmike (2002-07-30 12:43:00) [7]Нашёл:
SE_BACKUP_NAME требует выполнять операции сохранения, можешь подсказать что с этим делать и как это побороть? Плз.
Digitman (2002-07-30 12:12:00) [8]Вчитайся и проверь эти условия :
The RegSaveKey function saves only nonvolatile keys. It does not save volatile keys. A key is made volatile or nonvolatile at its creation; see RegCreateKeyEx.
Windows NT: The calling process must have the SE_BACKUP_NAME privilege. For more information about privileges, see Privileges.
madmike (2002-07-30 11:22:00) [9]Мужики, спецы! Не бросайте в беде! Разъясните, пожалуйста. :(
madmike (2002-07-20 21:54:00) [10]Нихрена не проходит, я в шоке, но по твоему коду создаётся пустой файл, но ошибку вываливает всё-равно :(
Digitman (2002-07-19 11:42:00) [11]Извини, запарился я уже с этими слэшами)))
вот это работает :
const
sub: string="\software";
...
Digitman (2002-07-19 11:39:00) [12]Слушай, ну у меня все с ведущим бэкслэшем работает !
Вот 100%-но работающий у меня код (D5.5, W2k Pro SP2):
const
sub: string="software\";
...
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey(sub,true) then
try
if (not reg.SaveKey(sub,"c:\registr")) then
showmessage("error");
finally
reg.free;
end;
По дешифрации кода отказа RegSaveKey() (хэлп):
If the function fails, the return value is a nonzero error code defined in WINERROR.H. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
troits (2002-07-19 11:16:00) [13]>Если я правильно тебя понял, то Винда спецом не даёт эту операцию?
Да. Для выполнения этой ф-ции процесс юзера должен иметь привилегии на BackUp. По - моему, как правило, их нет. По крайней мере, у меня :)
>Не понял: Проверь код ошибки , возвращаемый RegSaveKey
Если ты в отладчике "войдешь" в SaveKey, то увидишь, что там вызывается API - ф-ция RegSaveKey. Кстати, а что возвращает сама SaveKey?
Так вот, даже если ты и установишь необходимые привилегии, мне кажется, это тебя не спасет, так как формат, в котором будет записана ветка реестра - не текстовый, и , более того, различен для разных версий Windows.
Для сохранения ветки придется, ИМХО, самому все писать в своём формате, или поискать уже готовые решения.
madmike (2002-07-19 02:42:00) [14]Код ошибки "0" по getlasterror. Куда я только слэши не ставил :(
2 troits:
Если я правильно тебя понял, то Винда спецом не даёт эту операцию?
Подскажи, как запустить эту хренотень, надо, блинн, кровь из носу.
Не понял:
Проверь код ошибки , возвращаемый RegSaveKey
troits (2002-07-18 19:10:00) [15]Поправка: приоритета читать как привилегии
troits (2002-07-18 19:09:00) [16]Да.. Где-то я уже это видел...
ИМХО, проблема в том, что твой процесс не имеет приоритета SE_BACKUP_NAME !!!. Проверь код ошибки , возвращаемый RegSaveKey, которая вызывается из reg.SaveKey.
Digitman (2002-07-18 18:56:00) [17]
const
sub: string="\software";
я тоже ведущий бэкслэш упустил из виду)
он нужен обязательно
Digitman (2002-07-18 18:49:00) [18]нет, ну а что говорит GetLastError()-то ? После выполнения SaveKey() ?
madmike (2002-07-18 18:43:00) [19]Open ошибку не даёт. Без расширения не проходит тоже, имена менял. ????????? Кто-нить попробуйте прогнать процедуру, плз.
Digitman (2002-07-18 13:01:00) [20]Хм... "По хэлпам все правильно", говоришь ?
Да нет, сударь, по хэлпам как раз неправильно у тебя получается ...
в хэлп-примере к методу TRegistry.OpenKey() есть как минимум следующее :
if Reg.OpenKey("...", True) then ...
Почувствуй разницу. Борланд настоятельно рекомендует тебе анализировать булев результат, возвращаемый OpenKey(), а ты этого не делаешь почему-то. И , соответственно, не знаешь : то ли OpenKey() не работает, то ли SaveKey() ...
OpenKey(), конечно, не дает отказ у тебя, но в общем случае такая проверка должна присутствовать.
Отказ дает у тебя SaveKey(), потому что ты не в читался (или проигнорировал) в по кр.мере одно из условий того же упомянутого тобой хэлпа по SaveKey().
Цитирую описание второго параметра FileName:
FileName is the file into which to save the key information. It must be the name of a new file that does not already exist. On FAT file systems FileName cannot include an extension.
Вчитался ? Принимай меры - и все заработает)
А у тебя - FAT скорее всего.