Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
ВнизУставновлени прав на ключ реестра для пользователя Найти похожие ветки
← →
Сергей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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c