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

Вниз

Использование 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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.045 c
1-1135656881
Alex_V
2005-12-27 07:14
2006.01.29
и все же хотелось выяснить


15-1136474178
BiggieSmalls
2006-01-05 18:16
2006.01.29
Бан на php серваках


9-1124420133
anton_321
2005-08-19 06:55
2006.01.29
у кого есть скаченный DirectX9 SDK?


15-1135963908
sniknik
2005-12-30 20:31
2006.01.29
GIF анимация, эффект развивающегося флага.


15-1136290092
DillerXX
2006-01-03 15:08
2006.01.29
SimCity 4 - есть кто играл?