7

Windows/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

フラグSetNamedSecurityInfoと一緒に使用します。UNPROTECTED_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 に答える