重置文件安全性以在MoveFile()操作后继承

时间:2013-07-08 21:58:05

标签: c++ windows security

视窗/ C ++

寻找有关如何在文件移动到新文件夹后重置文件的安全属性的一些建议。

我们创建文件(以及从服务器下载)的标准方法是在临时文件夹中创建文件,然后在文件向下流时,附加文件。下载完成后,我们将文件移动到它的最终目的地。

MoveFile()将在移动文件时传输文件的安全性。在某些配置中,这会导致问题 - 最终文件夹的安全性默认值与原始文件夹不匹配。我们不能搞乱文件夹安全....

所以,最终,我想在移动文件后对文件执行操作。我目前的想法是,我应该获取它进入的文件夹的安全属性,然后在移动完成后应用于该文件。

2 个答案:

答案 0 :(得分:5)

为了扩展Harry的答案,这里是完整的代码:

// 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权限,因此无法从作为网络服务(或本地服务)运行的服务调用它,因为它们具有{{3} }}

答案 1 :(得分: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);