2012-05-28 13 views
1

我的實用程序從目錄&中提取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的

回答

0

哦......傻了。我正在檢查INHERIT_ONLY_ACE以查看ACE是否已被插入...正如Mox指出的,任何方式都會通過vista(及更高版本)添加新的ACE,以增強基於Windows的對象中的完整性檢查。但是,這並不會改變ACE的解釋方式。我的代碼很好,我只是檢查一個額外的標誌。

感謝Mox教育我。

- Varun的

1

是,ACE已經與Vista的到來,主要是因爲Integrity Level整合的改變 - 以前稱爲完整性控制(IL)。當您的代碼必須在Windows 7和XP上運行時,您必須手動處理這些問題。

+0

ACE變化的另一個例子(http://helgeklein.com/blog/2009/03/permissions-a-primer-or-dacl-sacl-owner-sid-and-ace -explained /) – mox