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

Вниз

Уставновлени прав на ключ реестра для пользователя   Найти похожие ветки 

 
Сергей333   (2005-08-23 13:05) [0]

Здравствуйте. Мне нужно установить полные права на ключ реестра для пользователя UserName. Я делаю следующим образом:



var
 Key       : HKEY;
 test      : integer;
 pAbsSD    : PSECURITY_DESCRIPTOR;
 pOwnerSid : PSid;
 lpDomain  : PWideChar;
 cbDomain,
 cbSid     : Cardinal;
 peUse     : Cardinal;
 pNewDACL  : PACL;

 lpname    : PWideChar;

 dwDACLLength: dword;
 cbName    : Cardinal;

begin
 cbSid:=128;
 cbDomain:=64;

 GetMem(pOwnerSid,cbSid);
 GetMem(lpDomain,cbDomain*SizeOf(WideChar));

 LookupAccountNameW(nil, "UserName",pOwnerSid,cbSid,lpDomain,cbDomain,peUse)

 test := RegOpenKeyEx(HKEY_CURRENT_USER,"Test",0,KEY_ALL_ACCESS, Key);

 if test = ERROR_SUCCESS then
 begin
   dwDACLLength:=SizeOf(TACL) + 8 +
     GetLengthSid(pOwnerSid) - sizeof(DWORD);

   GetMem(pNewDACL,dwDACLLength);
   GetMem(pAbsSD,SECURITY_DESCRIPTOR_MIN_LENGTH+dwDACLLength);

   if not InitializeSecurityDescriptor(pAbsSD,1) then
     ShowMessage("fail");

   if not InitializeAcl(pNewDACL^,dwDACLLength,2) then
     ShowMessage("fail");

   AddAccessAllowedAce(pNewDACL^,2,MAXIMUM_ALLOWED,pOwnerSid);

   if not SetSecurityDescriptorDacl(pAbsSD,true,pNewDACL,false) then
     ShowMessage("fail!")

   else if RegSetKeySecurity(Key,DACL_SECURITY_INFORMATION,pAbsSD)<> ERROR_SUCCESS then
     ShowMessage("fail!");

   RegCloseKey(key);
 end;

 // фсякие освобождения памяти



но в результате на этот ключ полностью пропадают все права. Подскажите, что не так.


 
Игорь Шевченко ©   (2005-08-23 14:07) [1]


>  AddAccessAllowedAce(pNewDACL^,2,MAXIMUM_ALLOWED,pOwnerSid);


Замени MAXIMUM_ALLOWED на KEY_READ, например


 
Сергей333   (2005-08-23 16:12) [2]

Заменил, результат тот же.


 
Игорь Шевченко ©   (2005-08-23 16:29) [3]


> if test = ERROR_SUCCESS then
>  begin
>    dwDACLLength:=SizeOf(TACL) + 8 +
>      GetLengthSid(pOwnerSid) - sizeof(DWORD);


Замени 8 на sizeof(ACCESS_ALLOWED_ACE) и желательно вообще все цифры заменить на константы из Platform SDK. Такое впечатление, что ты сформировал некорректный ACL


 
BiN ©   (2005-08-23 16:49) [4]

Сергей333   (23.08.05 13:05)  

  dwDACLLength:=SizeOf(TACL) + 8 +
    GetLengthSid(pOwnerSid) - sizeof(DWORD);


У тебя размер Dacl-а вычисляется неправильно:
т.е. получается в итоге GetLengthSid(pOwnerSid)+12.

А нужно:

{SizeOf(TACL)}+{суммарный размер ACE-ов}
или же
SizeOf(TACL)+Sizeof(ACCESS_ALLOWED_ACE)-sizeof(PACCESS_ALLOWED_ACE(0).SidStart)+GetLengthSid(pOwnerSid)
или же
GetLengthSid(pOwnerSid)+16


 
Сергей333   (2005-08-23 17:10) [5]

Большое спасибо всем, действительно дело в размере Dacl. :)



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.026 c
14-1129017680
Ega23
2005-10-11 12:01
2005.10.30
Странно....


4-1121785751
Valera
2005-07-19 19:09
2005.10.30
При перехвате сообщения WMEraseBkgnd получаю HDC больше Integer


2-1128594808
Del_programmer
2005-10-06 14:33
2005.10.30
строки


5-1107336978
khas
2005-02-02 12:36
2005.10.30
Добавление "детей" в DesignTime в свой компонент


2-1128513848
Vladimir88
2005-10-05 16:04
2005.10.30
Вещественные числа