我下面的代码适用于各种ACE更改以及添加和撤消操作-当我尝试删除ACL(显然在那里)中的ACE时,它只是不起作用,但是此ACE是继承的。
撤销未继承的ACE的SetEntriesInAcl()
起作用,减少了ACL ACE计数,以下SetNamedSecurityInfo()
进行了撤销,并且ACE消失了。
但是,当继承ACE(这两个API都返回SUCCESS
)但未删除/撤消ACE时,ACL ACE计数保持不变。
我也已经编写了DeleteAce()
的代码,但是当再次在SetNamedSecurityInfo()
中使用该DACL时,RC就是SUCCESS
(无返回代码),并且ACE仍保留在我正在处理的文件夹中-显然,有一个技巧可以删除继承的ACE。
顺便说一句,对于有问题的同一文件夹,SUBINACL命令行工具可以毫无问题地撤销此继承的ACE。
if( EqualSid( pSid_for_ace, pSid ) )
{ /* ACE SID matched edit SID */
if( cmd_se_edit == SE_REM )
{ /* remove */
rem_lst[ ace_idx ] = x;
exp_ace[ ace_idx ].grfAccessPermissions = dwAccessRights;
exp_ace[ ace_idx ].grfAccessMode = REVOKE_ACCESS;
exp_ace[ ace_idx ].grfInheritance = dwInheritance;
exp_ace[ ace_idx ].Trustee.TrusteeForm = TRUSTEE_IS_SID;
exp_ace[ ace_idx ].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
exp_ace[ ace_idx ].Trustee.ptstrName = pSid;
if( ace_idx < (REMMAX-1) ) ++ace_idx;
} /* remove */
} /* ACE SID matched edit SID */
pBA = (BYTE *)p_aceHdr;
ace_sz = p_aceHdr->AceSize;
p_aceHdr = (PACE_HEADER)&pBA[ ace_sz ];
} /* loop through ACEs */
// Create a new ACL that merges the new ACE
// into the existing DACL.
if( ace_idx )
{ /* ACEs to remove */
dwRes = SetEntriesInAcl( ace_idx, &exp_ace[0],
pDacl, &pNewDacl );
if( ERROR_SUCCESS != dwRes )
{
printf( "SetEntriesInAcl Error %u\n", dwRes );
goto Cleanup2;
}
// Attach the new ACL as the object's DACL.
dwRes = SetNamedSecurityInfo( ObjName,
ObjectType,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
pNewDacl,
NULL );
if( ERROR_SUCCESS != dwRes )
{
rc3 = GetLastError();
printf( "SetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup2;
}
} /* ACEs to remove */
最佳答案
目前看来,您似乎正在从文件夹中检索现有的ACL并对其进行修改。在您的情况下,最好从头开始构建新的ACL。为此,构建一个描述所需权限的EXPLICIT_ACCESS结构数组,并调用SetEntriesInAcl,为OldAcl传递NULL。
要应用新的DACL,请以与您在代码中相同的方式调用SetNamedSecurityInfo,但为SecurityInfo传递DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION
。 PROTECTED_DACL_SECURITY_INFORMATION标志禁用从父级继承。
关于windows - REVOKE_ACCESS : how to remove 'revoke' an inherited ACE?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9046060/