![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уставновлени прав на ключ реестра для пользователя
Сергей333 © (2005-08-23 13:05:00)Здравствуйте. Мне нужно установить полные права на ключ реестра для пользователя 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;
// фсякие освобождения памяти
но в результате на этот ключ полностью пропадают все права. Подскажите, что не так.
Сергей333 (2005-08-23 17:10:00) [1]Большое спасибо всем, действительно дело в размере Dacl. :)
BiN (2005-08-23 16:49:00) [2]Сергей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
Игорь Шевченко (2005-08-23 16:29:00) [3]
> if test = ERROR_SUCCESS then
> begin
> dwDACLLength:=SizeOf(TACL) + 8 +
> GetLengthSid(pOwnerSid) - sizeof(DWORD);
Замени 8 на sizeof(ACCESS_ALLOWED_ACE) и желательно вообще все цифры заменить на константы из Platform SDK. Такое впечатление, что ты сформировал некорректный ACL
Сергей333 (2005-08-23 16:12:00) [4]Заменил, результат тот же.
Игорь Шевченко (2005-08-23 14:07:00) [5]
> AddAccessAllowedAce(pNewDACL^,2,MAXIMUM_ALLOWED,pOwnerSid);
Замени MAXIMUM_ALLOWED на KEY_READ, например