1

我的实用程序从一个目录中提取 ACL 并将其添加到另一个目录中。我的问题是这个-

在遍历 ACE 时,我发现对于带有 的 ACE AceFlags value = 0,继承标志(应用到)是“文件夹、子文件夹和目录”。当我将相同的 ACL 应用到另一个目录时,在 Windows 7 中它可以正常工作。但是,在 Windows XP 中,继承标志更改为“仅文件夹”。这是代码 -

BOOL SetNonInheritedAceToTarget(LPWSTR pszSource, LPWSTR pszDestination)
{
BOOL bRetVal = FALSE;

DWORD dwRes = 0;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pacl = NULL;

if( ERROR_SUCCESS == GetNamedSecurityInfo(pszSource, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pacl, NULL, &pSD) )
{
    if(pacl)
    {
        for (USHORT i = 0; i < pacl->AceCount; i++)
        {
            ACCESS_DENIED_ACE * PACE = NULL;

            if (!GetAce(pacl, i,(LPVOID*) &PACE))
                continue;

            if(PACE->Header.AceFlags & INHERIT_ONLY_ACE || PACE->Header.AceFlags & INHERITED_ACE)
            {
                // Delete the ACE
                if(!DeleteAce(pacl, i))
                {
                    TCHAR szErrorMsg[300] = {0};
                    wsprintf(szErrorMsg, L"Unable to delete ACE from DACL of = %ls", pszSource);
                    OutputDebugString(szErrorMsg);
                }
            }
        }
    }
}

if(ERROR_SUCCESS == SetNamedSecurityInfo(pszDestination, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, pacl, NULL))
    bRetVal = TRUE;

return bRetVal;
}

我不知道我是在弄乱代码还是真的与操作系统相关的问题。帮助!!!。同样,如果是与操作系统相关的问题,有什么建议,我应该手动分配 AceFlag 吗?

-- 瓦伦

4

2 回答 2

1

是的,ACE 已经随着 Vista 的到来而改变,主要是因为集成了Integrity Level——以前称为 Integrity Control (IL)。当您的代码必须在 Windows 7 和 XP 上运行时,您必须手动处理这些问题。

于 2012-05-28T16:07:56.403 回答
0

哦...愚蠢的我。我正在检查 INHERIT_ONLY_ACE 以查看它是否继承了 ACE……正如 Mox 指出的那样,在 vista(及更高版本)中,已添加新的 ACE 以增强基于 Windows 的对象的完整性检查。但是,这不会改变 ACE 的解释方式。我的代码很好,我只是在检查一个额外的标志。

感谢 Mox 对我的教育。

-- 瓦伦

于 2012-05-29T11:45:17.227 回答