Comment donner des permissions en lecture / écriture à un dossier pendant l'installation using.NET

j'ai un projet D'installation que J'ai construit en utilisant Visual Studio 2010.

l'installateur fonctionne très bien en termes d'installation de l'application et de toutes ses dépendances dans leurs sous-répertoires et répertoires de données de programme appropriés.

cependant, j'ai remarqué que chaque répertoire (le répertoire racine et tous ses sous-répertoires) que l'installateur a créé ne donne pas les permissions "en écriture". La seule autorisations qui sont ajoutés les répertoires pour le groupe "Utilisateurs" sont:

  • Read & Execute
  • afficher le contenu du dossier
  • Lire

ceci, le réglage des permissions par défaut apparentes, se produira indépendamment du fait que l'utilisateur installe l'application en tant qu ' "administrateur" ou non.

il me semble étrange que l'installateur ne donne pas les permissions "en écriture" à un dossier qui est utilisé par l'application qui est en train d'être installée - c'est encore plus déroutant que le dossier que l'installateur crée dans le ProgramData le dossier de la base de données de l'application ne reçoit pas les permissions "Write".

Ma question est, est-il un moyen de configurer le projet d'Installation de sorte que, si et quand il crée un dossier, nous pouvons lui dire quel type d'autorisations à donner et à qui. Dans mon cas, j'ai besoin de donner le répertoire racine (de l'application) et de tous ses sous-répertoires, et le dossier est placé dans le ProgramData permissions de "lecture/écriture" pour le "groupe D'utilisateurs". Techniquement, je suis cool avec donner le "contrôle total" du dirs au "groupe D'utilisateurs".

24
demandé sur leppie 2011-09-02 23:36:20

6 réponses

par défaut, le groupe des utilisateurs n'a pas d'accès en écriture dans les emplacements par machine comme les fichiers de programme. Il s'agit d'un Standard Windows qui n'est pas lié aux installations. Cependant, pendant l'installation, vous pouvez définir les permissions que vous voulez.

Windows Installer prend en charge les permissions personnalisées, mais Visual Studio n'offre aucun moyen de les configurer. Donc la seule solution dans Visual Studio est une action personnalisée.

malheureusement Visual Studio ne supporte pas les actions personnalisées. Donc, en utilisant XCACLS.EXE pour définir des autorisations ne fonctionne que si vous l'incluez dans votre colis, il sera installé sur la machine cible avec vos fichiers).

une solution plus propre, mais plus complexe est d'écrire une action personnalisée vous-même (en utilisant du code personnalisé) pour définir les permissions que vous voulez.

la solution la plus rapide et la plus propre serait d'utiliser un outil de création de setup différent qui offre plus de contrôle sur les permissions.

9
répondu user527987 2011-09-02 21:44:22

je suppose que mon autre message a été supprimé pour être un peu trop général, donc je l'ai affiné ci-dessous:

La chose à faire est de faire une action personnalisée. C'est assez simple, consultez la revue MSDN pour écrire une action c# custom ici. Vous mettrez votre code de modification de permission dans la méthode D'installation:

suivez les premières étapes à partir du lien pour obtenir un nouveau projet d'installateur référencé à partir de votre solution d'installateur. Vous avez à faire à ce façon, de sorte que vous pouvez créer une dll qui est appelée à la fin de l'installation.

en fait, définir les privilèges de lecture/écriture pour les utilisateurs était un peu plus délicat, et le plus proche que j'ai pu obtenir était de définir pour les utilisateurs authentifiés. J'ai concocté quelques autres solutions que J'ai trouvées sur Internet pour trouver ceci:

public override void Install(IDictionary stateSaver)
{
    // This gets the named parameters passed in from your custom action
    string folder = Context.Parameters["folder"];

    // This gets the "Authenticated Users" group, no matter what it's called
    SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);

    // Create the rules
    FileSystemAccessRule writerule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow);

    if (!string.IsNullOrEmpty(folder) && Directory.Exists(folder))
    {
        // Get your file's ACL
        DirectorySecurity fsecurity = Directory.GetAccessControl(folder);

        // Add the new rule to the ACL
        fsecurity.AddAccessRule(writerule);

        // Set the ACL back to the file
        Directory.SetAccessControl(folder, fsecurity);
    }

    // Explicitly call the overriden method to properly return control to the installer
    base.Install(stateSaver);
}

puis, lorsque vous créez votre action personnalisée, éditez ses propriétés, et ajoutez quelque chose comme ça sous la propriété CustomActionData:

/folder="[CommonAppDataFolder][ProductName]"
34
répondu ACK_stoverflow 2014-08-21 09:47:06
private static void GrantAccess(string file)
        {
            bool exists = System.IO.Directory.Exists(file);
            if (!exists)
            {
                DirectoryInfo di = System.IO.Directory.CreateDirectory(file);
                Console.WriteLine("The Folder is created Sucessfully");
            }
            else
            {
                Console.WriteLine("The Folder already exists");
            }
            DirectoryInfo dInfo = new DirectoryInfo(file);
            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);

        }

le code ci-dessus définira les droits d'accès du dossier au plein contrôle/ lecture-écriture à chaque utilisateur (tout le monde).

6
répondu Richendra kumar ravi 2016-08-02 10:23:33

le comportement est de conception. Les programmes ne devraient pas se modifier (donc leur répertoire d'installation) pour autre chose que des mises à jour (ce qui peut être fait sans problème avec Windows installer). Si vous utilisez .NET,stockage isolé est un excellent endroit pour stocker des données utilisateur.

3
répondu Teoman Soygul 2011-09-02 19:43:14
DirectoryInfo info = new DirectoryInfo(path[x]);

DirectorySecurity security = info.GetAccessControl();

security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.Modify, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));

security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.Modify, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));

info.SetAccessControl(security); 

définir la partie hériter est également important si vous voulez enregistrer et accéder à plus d'un fichier dans le dossier ProgramData.

3
répondu Kristian Søgaard 2013-11-14 21:07:36

comme il a été mentionné ci-dessus, le groupe D'utilisateurs n'a pas la permission d'écrire dans les fichiers de programme. Si vous ne voulez pas traiter avec la classe installer ou Wix (si c'est un programme simple), il suffit d'installer votre logiciel sous un Volume Windows.

je suis en train de parler Visual Studio Assistant De Configuration: Changer Le Dossier D'Application' DefaultLocation Propriété de [ProgramFilesFolder] à [WindowsVolume] [Fabricant] [Nomduproduit] dans le système de fichiers sur la cible Machine.

0
répondu depicci 2015-11-20 12:43:57