2013-07-08 32 views
4

的Windows/C++重置文件的安全性繼承後一個MoveFile()操作

尋找關於如何重置它被轉移到一個新的文件夾後,一個文件的安全屬性提出了一些建議。

我們創建文件的標準方式(從服務器上下載)是一個臨時文件夾中創建的文件,然後作爲文件流下來,該文件被追加。下載完成後,我們將文件移至最終目的地。

移動文件時,MoveFile()將傳輸文件上的安全性。在某些配置中,這會導致出現問題 - 最終文件夾的安全默認值與原始文件夾不匹配。我們不能搞亂文件夾的安全....

所以,最終,我想在我移動它之後對文件執行操作。我目前的想法是,我應該獲取它所進入的文件夾的安全屬性,然後在移動完成後應用到文件。

回答

2

使用SetNamedSecurityInfoUNPROTECTED_DACL_SECURITY_INFORMATION標誌。只需傳遞一個空ACL以刪除文件從其父節點獲得的條目。這將是這個樣子:

error = SetNamedSecurityInfo(
      path_to_file, 
      SE_FILE_OBJECT, 
      DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, 
      NULL, 
      NULL, 
      empty_acl, 
      NULL); 
4

爲了擴大哈利的答案,這裏是全碼:

// blank acl used to restore permissions after a file move 
ACL g_null_acl = { 0 }; 
InitializeAcl(&g_null_acl, sizeof(g_null_acl), ACL_REVISION); 

DWORD error = SetNamedSecurityInfo(file_path, SE_FILE_OBJECT, 
    DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, 
    NULL, NULL, (PACL)&g_null_acl, NULL); 

記住調用SetNamedSecurityInfo(在這種情況下),需要SE_RESTORE_NAME權限,所以它不能從作爲網絡服務(或本地服務)運行的服務中調用,因爲它們具有limited permissions

+0

只有在您更改SACL時才需要'SE_SECURITY_NAME'。在這種情況下,我們只是改變DACL,因此不需要。但是,你需要或者合適的文件級權限,或'SE_RESTORE_NAME'。 –

+0

@HarryJohnston,更新,謝謝。 –

+0

可能值得注意的是,當以這種方式使用':: SetNamedSecurityInfo'時不會返回ERROR_SUCCESS。它似乎總是返回1008(0x3f0):「試圖引用不存在的令牌。」它似乎仍然工作正常。 (這是在Win 7 SP1 64進行測試。) –