Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1137048465
Alex7
2006-01-12 09:47
2006.01.29
Координаты диалоговых окон


9-1124205351
ArtemESC
2005-08-16 19:15
2006.01.29
DirectDraw.pas


2-1136978527
dr D
2006-01-11 14:22
2006.01.29
Как распарсить строку (WideString)?


15-1136585297
Ag.Smit
2006-01-07 01:08
2006.01.29
ASUS ATI Radeon 9600pro глючит!!!


3-1133347832
_Lucky_
2005-11-30 13:50
2006.01.29
Организация вложенного запроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский