我正试图将两个条目设置到同一组的对象文件夹中,具有不同的继承(一个NO_inheritance用于FILE_TRAVERSE,另一个为SUB_CONTAINERS_AND_OBJECTS_INHERIT,用于GENERIC_READ)。我看到每次最后一次调用都会覆盖先例。我是用delphi写的(但如果是C++或C…也是一样的)。有人能帮我解决什么问题吗?
这是调用函数:
function setACL(const foldername:string;const SID:PSID;const AccessPermissions:cardinal;
const AccessMode:ACCESS_MODE;const Inheritance:cardinal;
const TrusteeType:TRUSTEE_TYPE):boolean;
var
pEA: PEXPLICIT_ACCESS_W;
pDACL: PACL;
R: DWORD;
begin
pEA := AllocMem(SizeOf(EXPLICIT_ACCESS_W));
pEA^.grfAccessPermissions:=AccessPermissions;
pEA^.grfAccessMode:=AccessMode;
pEA^.grfInheritance:=Inheritance ;
pEA^.Trustee.TrusteeForm:=TRUSTEE_IS_SID;
pEA^.Trustee.TrusteeType:=TrusteeType;
pEA^.Trustee.ptstrName:=PWideChar(sid);
R := SetEntriesInAcl(1, pEA, nil, pDACL);
if R = ERROR_SUCCESS then
begin
if SetNamedSecurityInfo(pchar(foldername),
SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
nil,
SID,
pDACL,
nil) <> ERROR_SUCCESS then ShowMessage('SetNamedSecurityInfo failed: ' + SysErrorMessage(GetLastError));
LocalFree(Cardinal(pDACL));
end
else ShowMessage('SetEntriesInAcl failed: ' + SysErrorMessage(R));
end;
我用这种方式称它两次:
Groupname:='myNetaGroup';
Get_SID('wbox0',groupname,sid);//this function just to get SID
foldername := '\wbox0tempfilippo'; //the folder to set permissions
setACLGroupFolder(foldername,sid,FILE_TRAVERSE,SET_ACCESS,NO_INHERITANCE,TRUSTEE_IS_GROUP);
setACLGroupFolder(foldername,sid,GENERIC_READ,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT,TRUSTEE_IS_GROUP);
第二个呼叫取代了第一个呼叫。最后,我没有得到同一组的两个条目。
我看到每次最后一次调用都会覆盖先例。
这不是大多数安全API的行为。就DACL API而言,您只需创建DACL,它只是ACE的列表,并将DACL交给操作系统。操作系统不执行任何形式的折叠或类似的操作,这就是为什么将ACE按错误的顺序排列可能(很容易)出错的原因。(拒绝ACE需要在允许ACE之前进行…)
现在,您使用的是API,这是一个例外--SetEntriesInAcl
尝试将多个权限集"合并"在一起。如果您不想要这种行为,您需要使用AddAce
和类似的函数自己构建DACL。