Форум: "WinAPI";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизИспользование RegSaveKey Найти похожие ветки
← →
The One © (2005-11-16 20:55) [0]Здравствуйте уважаемые мастера.
В своем ПО мне необходимо сохранять некий ключ рееста Win NT. Вызываю API функцию RegSaveKey(KeyHandle,"C:\1.reg",nil), создается пустой файл. Значение возвращаемое функцией - 1314, которое описанно как ERROR_PRIVILEGE_NOT_HELD, т.е. видимо дело в последнем параметре, который задан как nil, что должно было бы по идеи установить привилегии принятые по умолчанию. Ктому же в исходниках TRegistry данная API-функция вызывается также. В чем же всетаки здесь проблемма?
ЗЫ: Заранее благодарю.
← →
Игорь Шевченко © (2005-11-17 10:05) [1]Установи себе SE_BACKUP_PRIVILEGE
← →
The One © (2005-11-17 20:23) [2]
Установи себе SE_BACKUP_PRIVILEGE
Согласно справке - SE_BACKUP_NAME. Вопрос в том, как дать эту привелегию процессу?
← →
The One © (2005-11-17 21:21) [3]Залез на мсдн, обнаружил там сей примерчик:
[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
← →
Игорь Шевченко © (2005-11-17 22:26) [4]
> 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 23:15) [5]
> SE_BACKUP_NAME
Всеж наверное и так и так верно ) Счас вот вчитался и понял, что SE_BACKUP_NAME - эт некая константа, а вот в вышеописаную процедуру следует передавать строку "SeBackupPrivilege".
А так все работает. Спасибо за помошь.
← →
The One © (2005-11-19 15:20) [6]Нарисовалась еще одна проблемма. Использую RegSaveKey. Значение возвращаемое функцие ERROR_SUCCESS. Файл создан, но в нём какае-то билиберда:
regf П––яЬШШяаЯЯяЪССяЬММяД¬¬яі??ы dGD7 П––ятттясссяЮЭЭяЪїїяЛџџяї‘‘я1!!И4$$»7$$ґ§ Њ`% ё Jї––яЯїїяШДДяП––яЛzzяѕ‰‰яї––яї––яї––яї––яxYYе –J
При попытки выполнить его Винда сообщает, что это не файл реестра. Помогите плиз разобраться, что это за пакость?
← →
Anatoly Podgoretsky © (2005-11-19 16:21) [7]Не билиберда а двоичные данные, а файл реестра ни кто и не обещал, только это. Хочешь файл реестра, то сам пиши в текстовом виде, рекурсивно и в соответствии с форматом. Или используй RegEdit
← →
Джо © (2005-11-19 16:28) [8]Может, воспользоваться RegSaveKeyEx? Он, кажется, позволяет формат выбрать (не проверял).
← →
The One © (2005-11-19 17:07) [9]На 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 17:29) [10]
> [9] The One © (19.11.05 17:07)
Мда, Requires Windows "Longhorn" or Windows XP. Может, не на XP проверяешь?
← →
Джо © (2005-11-19 17:31) [11]А, кстати, если на XP, то укажи
name
"RegSaveKeyExA
" или"RegSaveKeyExW"
для Юникод-версии.
← →
The One © (2005-11-19 18:27) [12]Да уж, невнимателен, там же по-русски написанно: Implemented as RegSaveKeyExW (Unicode) and RegSaveKeyExA (ANSI). =)
В любом случае создается тот же файл.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.053 c