7

视窗/C++

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

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

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

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

4

2 回答 2

8

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

// 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特权,因此不能从作为网络服务(或本地服务)运行的服务调用,因为它们的权限有限

于 2013-11-15T19:37:46.430 回答
4

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);
于 2013-07-18T21:10:31.117 回答