Réinitialisation de la sécurité des fichiers pour hériter APRES une opération MoveFile ()

Windows / C ++

Vous recherchez des recommandations sur la façon de réinitialiser les atsortingbuts de sécurité sur un fichier après son déplacement dans un nouveau dossier.

Notre méthode standard de création de fichiers (et de téléchargement à partir du serveur) consiste à créer le fichier dans un dossier temporaire, puis, à mesure que le fichier est diffusé, le fichier est ajouté. Une fois le téléchargement terminé, nous déplaçons le fichier vers sa destination finale.

MoveFile () transfère la sécurité sur le fichier lorsque le fichier est déplacé. Dans certaines configurations, cela provoque un problème – où les parameters de sécurité par défaut du dossier final ne correspondent pas au dossier d’origine. Nous ne pouvons pas gâcher avec la sécurité des dossiers ….

Donc, finalement, je voudrais effectuer une opération sur le fichier après l’avoir déplacé. Ma pensée actuelle est que je devrais récupérer les atsortingbuts de sécurité du dossier dans lequel il se trouve, puis appliquer au fichier une fois le déplacement terminé.

Pour développer la réponse de Harry, voici le code complet:

// 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); 

Gardez à l’esprit que l’appel de SetNamedSecurityInfo (dans cette instance) nécessite des privilèges SE_RESTORE_NAME , de sorte qu’il ne peut pas être appelé à partir d’un service exécuté en tant que service réseau (ou service local), car ses permissions sont limitées .

Utilisez SetNamedSecurityInfo avec l’indicateur SetNamedSecurityInfo . Il suffit de passer une ACL vide pour supprimer les entrées que le fichier a obtenues de son parent précédent. Cela ressemblerait à ceci:

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