web-dev-qa-db-fra.com

Comment accorder une autorisation complète à un fichier créé par mon application pour TOUS les utilisateurs?

L'outil que je développe doit octroyer les droits d'accès "Contrôle total" à un fichier créé par celui-ci. Il doit être lu, modifié et supprimé de tous les comptes Windows et même de futurs comptes possibles. Cela pourrait-il être réalisé?

Je sais que je peux essayer ceci pour un SPECIFIC_USER:

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(filePath);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(filePath, fSecurity);

Mais comment puis-je l'accorder à tous les utilisateurs? Et même de futurs comptes possibles? Si la dernière partie n'est pas possible, comment procéder à la première exigence?

Merci.

MODIFIER:

C'est le code qui a fonctionné pour moi. Tiré du lien du répondeur.

private bool GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
        FileSystemRights.FullControl,
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

    dInfo.SetAccessControl(dSecurity);
    return true;
}

Noter la PropagationFlags.NoPropagateInherit qui est requis (mentionné vers le dernier dans le lien). Il accorde le privilège même aux comptes futurs.

64
nawfal

Note aux personnes qui utilisent ceci.

Lorsque vous utilisez des chaînes littérales pour le FileSystemAccessRule, il devrait être WellKnownSidType.WorldSid au lieu de "everyone".

La raison en est qu’il existe plusieurs langues Windows et que Tout le monde s’applique uniquement aux langues EN, donc pour l’espagnol, il peut s’agir de "Todos" (ou de tout autre élément).

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
}
112
Angelo Vargas

Vous devrez donner le contrôle total au groupe "Tout le monde" sur la machine. Trouvé ceci poste sur MSDN qui en parle.

J'espère que cela fonctionne pour toi.

12
Amar Palsapure