首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REVOKE_ACCESS :如何删除继承的ACE?

REVOKE_ACCESS :如何删除继承的ACE?
EN

Stack Overflow用户
提问于 2012-01-28 22:41:46
回答 1查看 1.5K关注 0票数 2

下面的代码适用于各种ACE的更改、添加和撤销-当我尝试删除ACL中的ACE (显然在那里)时,它不起作用,但此ACE是继承的。

用于撤销非继承ACE的SetEntriesInAcl()起作用,减少了ACL计数,下面的SetNamedSecurityInfo()执行撤销,ACE就消失了。

当ACE被继承时-这两个API都返回SUCCESS -但是ACE没有被删除/撤销,ACL计数保持不变。

我还编写了做DeleteAce()的代码,但是当在SetNamedSecurityInfo()中再次使用该DACL时,RC是SUCCESS (没有返回码),并且ACE仍然是我正在处理的文件夹-显然,有一个关于如何删除继承的ACE的诀窍。

顺便说一句,对于有问题的同一文件夹,SUBINACL命令行工具可以毫无问题地撤销这个继承的ACE。

代码语言:javascript
复制
                 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 */
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-03 05:50:39

目前,您似乎正在从文件夹中检索现有ACL并对其进行修改。在您的情况下,最好从头开始构建新的ACL。为此,构建一个描述所需权限的EXPLICIT_ACCESS结构数组,并调用SetEntriesInAcl,为OldAcl传递NULL。

要应用新的DACL,请使用与在代码中相同的方式调用SetNamedSecurityInfo,但要为SecurityInfo传递DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATIONPROTECTED_DACL_SECURITY_INFORMATION标志禁用从父级继承。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9046060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档