我的实用程序从一个目录中提取 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 吗?
-- 瓦伦