![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование RegSaveKey [D7, WinXP]
The One © (2005-11-16 20:55:00)Здравствуйте уважаемые мастера.
В своем ПО мне необходимо сохранять некий ключ рееста Win NT. Вызываю API функцию RegSaveKey(KeyHandle,'C:\1.reg',nil), создается пустой файл. Значение возвращаемое функцией - 1314, которое описанно как ERROR_PRIVILEGE_NOT_HELD, т.е. видимо дело в последнем параметре, который задан как nil, что должно было бы по идеи установить привилегии принятые по умолчанию. Ктому же в исходниках TRegistry данная API-функция вызывается также. В чем же всетаки здесь проблемма?
ЗЫ: Заранее благодарю.
The One (2005-11-19 18:27:00) [1]Да уж, невнимателен, там же по-русски написанно: Implemented as RegSaveKeyExW (Unicode) and RegSaveKeyExA (ANSI).=)
В любом случае создается тот же файл.
Джо (2005-11-19 17:31:00) [2]А, кстати, если на XP, то укажи
name'RegSaveKeyExA' или'RegSaveKeyExW'для Юникод-версии.
Джо (2005-11-19 17:29:00) [3]
> [9] The One © (19.11.05 17:07)
Мда, Requires Windows "Longhorn" or Windows XP. Может, не на XP проверяешь?
The One (2005-11-19 17:07:00) [4]На msdn нашел описание. Там сказанно, что функция хранится в advapi32.dll
function RegSaveKeyEx(hKey:HKEY;lpFile:LPCTSTR;lpSecurityAttributes:PSECURITYATTRIBUTES; Flags:DWORD):longint; stdcall; external 'advapi32.dll';
вот так я её описал.
Но при загрузке моей dll выдается сообщение, что Точка входа в процедуру RegSaveKeyEx не найдена в библиотеке DLL Advapi32.dll
Что тут не так?
Джо (2005-11-19 16:28:00) [5]Может, воспользоваться RegSaveKeyEx? Он, кажется, позволяет формат выбрать (не проверял).
Anatoly Podgoretsky (2005-11-19 16:21:00) [6]Не билиберда а двоичные данные, а файл реестра ни кто и не обещал, только это. Хочешь файл реестра, то сам пиши в текстовом виде, рекурсивно и в соответствии с форматом. Или используй RegEdit
The One (2005-11-19 15:20:00) [7]Нарисовалась еще одна проблемма. Использую RegSaveKey. Значение возвращаемое функцие ERROR_SUCCESS. Файл создан, но в нём какае-то билиберда:
regf\x1 \x1 \x1 \x3 \x1 \x10 \x1 \x7F\x7F\x7F\x1 П––яЬШШяаЯЯяЪССяЬММяД¬¬яі€€ы \x1\x1\x1d\x1\x1\x1G\x1\x1\x1D\x2\x2\x27\x4\x4\x4\x1D\x12\x12\x12\x7 П––ятттясссяЮЭЭяЪїїяЛџџяї‘‘я1!!И4$$»7$$ґ\x1D\x14\x14§ Њ\x1\x1\x1`\x3\x3\x3%\x19\x19\x19\x5 ё Jї––яЯїїяШДДяП––яЛzzяѕ‰‰яї––яї––яї––яї––яxYYе –\x1\x1\x1J\x7\x7\x7\x10
При попытки выполнить его Винда сообщает, что это не файл реестра. Помогите плиз разобраться, что это за пакость?
The One (2005-11-17 23:15:00) [8]
> SE_BACKUP_NAME
Всеж наверное и так и так верно ) Счас вот вчитался и понял, что SE_BACKUP_NAME - эт некая константа, а вот в вышеописаную процедуру следует передавать строку 'SeBackupPrivilege'.
А так все работает. Спасибо за помошь.
Игорь Шевченко (2005-11-17 22:26:00) [9]
> SE_BACKUP_NAME
Виноват, перепутал, действительно SE_BACKUP_NAME
Попробуй так:
function HSEnablePrivilege (const PrivilegeName: String): Boolean;
var
LUID: TLargeInteger;
Priv: TTokenPrivileges;
AccessToken: THandle;
ReturnLen: Cardinal;
begin
Result := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
AccessToken);
if not Result then
Exit;
Result := LookupPrivilegeValueA(nil, PChar(PrivilegeName), LUID);
if not Result then //Привилегия не нашлась
Exit;
Priv.PrivilegeCount := 1;
Priv.Privileges[0].Luid := LUID;
Priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(AccessToken, false, Priv,
SizeOf(TTokenPrivileges), nil, ReturnLen);
end;
The One (2005-11-17 21:21:00) [10]Залез на мсдн, обнаружил там сей примерчик:
[url] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/seccrypto/security/setting_the_backup_and_restore_privileges.asp[/url]
С Си я не очень дружу, посему перевел код так:
var
CurrProc:cardinal;
NewState:TOKEN_PRIVILEGES ;
luid:Int64;
hToken:cardinal ;
....
//в одной из функций выполняющихся в момент присоединения dll к процессу
CurrProc := GetCurrentProcess;
OpenProcessToken(CurrProc,TOKEN_ADJUST_PRIVILEGES and TOKEN_QUERY,hToken );
LookupPrivilegeValue(nil,'SE_BACKUP_PRIVILEGE',luid);
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := luid;
NewState.Privileges[0].Attributes :=(SE_PRIVILEGE_ENABLED);{??? пример с мсдн в этом строчке я дословно перевести не смог, посему просто отбросил "лишнее"}
AdjustTokenPrivileges(hToken,FALSE,NewState,0,nil,car);
CloseHandle(hToken);
Все компилируется на ура. Программа не вылетает, что уже радует, но ошибка вся таже - ERROR_PRIVILEGE_NOT_HELD
The One (2005-11-17 20:23:00) [11]
Установи себе SE_BACKUP_PRIVILEGE
Согласно справке - SE_BACKUP_NAME. Вопрос в том, как дать эту привелегию процессу?
Игорь Шевченко (2005-11-17 10:05:00) [12]Установи себе SE_BACKUP_PRIVILEGE