我的實用程序從目錄&中提取ACL將其添加到另一個目錄。我的問題是這樣的 -AceFlags行爲隨操作系統而改變嗎?
在遍歷ACE時,我發現對於使用AceFlags value = 0
的ACE,繼承標誌(Applied To)是「文件夾,子文件夾&目錄」。當我將相同的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嗎?
- Varun的
ACE變化的另一個例子(http://helgeklein.com/blog/2009/03/permissions-a-primer-or-dacl-sacl-owner-sid-and-ace -explained /) – mox