Главная страница
    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.045 c
2-1137093363
SergP
2006-01-12 22:16
2006.01.29
Как правильно описать тип (запись) с "виртуальными" полями?


3-1132756175
ASDF234
2005-11-23 17:29
2006.01.29
Надо засунуть с текстового файла данные в DBGRID.


15-1136481169
jack128
2006-01-05 20:12
2006.01.29
На Украине нашли месторождение алмазов


2-1136911936
RDS
2006-01-10 19:52
2006.01.29
вопрос по ToolHelp32


9-1124306435
Pinochet
2005-08-17 23:20
2006.01.29
DirectDraw. Поверхности большого размера.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский