Как дать разрешения на чтение / запись для папки во время установки с использованием .NET - PullRequest
28 голосов
/ 02 сентября 2011

У меня есть проект установки, который я создаю с использованием Visual Studio 2010.

Программа установки прекрасно работает с точки зрения установки приложения и всех его зависимостей в соответствующие подкаталоги и каталоги программных данных.

Однако я заметил, что каждый каталог (корневая папка и все его подкаталоги), созданный установщиком, не дает разрешения «Запись».Единственные разрешения, которые добавляются в каталоги для группы «Пользователи»:

  • Чтение и выполнение
  • Список содержимого папки
  • Чтение

Эта очевидная настройка разрешений по умолчанию произойдет независимо от того, устанавливает ли пользователь приложение как «Администратор» или нет.

Мне кажется странным, что установщик не дает разрешения «Запись»папка, которая используется устанавливаемым приложением. Еще более странно, что папка, которую установщик создает в папке ProgramData для базы данных приложения, не получает разрешений «Запись».

Мой вопрос заключается в том, существует ли способ настроить проект установки так, чтобы, если и когда он создает папку, мы могли сообщить ему, какой тип разрешений дать и кому.В моем случае мне нужно дать корневой каталог (приложения) и все его подкаталоги, а также папку, которая помещена в папку ProgramData «Чтение / запись» для «Группы пользователей».Технически, я крут с предоставлением директорам "Полный контроль" для "Группы пользователей".

Ответы [ 6 ]

36 голосов
/ 10 мая 2012

Полагаю, мой другой пост был удален из-за его слишком общего характера, поэтому я уточнил его ниже:

Нужно сделать специальное действие.Это довольно просто, посмотрите пошаговое руководство по MSDN для написания пользовательского действия на C # здесь .Вы поместите свой изменяющий права код в метод Install:

Следуйте первым шагам по ссылке, чтобы получить новый проект установщика, на который ссылается ваше решение для установки.Вы должны сделать это таким образом, чтобы вы могли создать dll, которая вызывается в конце установки.

На самом деле установка привилегий чтения / записи для пользователей была немного хитрее, и ближе всего я мог получитьнабор для аутентифицированных пользователей.Я собрал воедино несколько других решений, которые я нашел в Интернете, чтобы придумать следующее:

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

Затем, когда вы создаете свое собственное действие, редактируете его свойства и добавляете что-то подобное в свойстве CustomActionData:

/folder="[CommonAppDataFolder][ProductName]"
11 голосов
/ 03 сентября 2011

По умолчанию группа «Пользователи» не имеет доступа для записи в расположениях отдельных машин, таких как Program Files.Это стандарт Windows, который не связан с установками.Однако во время установки вы можете установить любые необходимые разрешения.

Установщик Windows поддерживает настраиваемые разрешения, но Visual Studio не предлагает способ их установки.Поэтому единственное решение в Visual Studio - это настраиваемое действие.

К сожалению, Visual Studio не поддерживает вложенные настраиваемые действия.Поэтому использование XCACLS.EXE для установки разрешений будет работать только в том случае, если вы включите его в свой пакет (он будет установлен на целевой машине вместе с вашими файлами).

Более чистый, но болееСложное решение состоит в том, чтобы самостоятельно написать пользовательское действие (используя пользовательский код) для установки необходимых разрешений.

Самым быстрым и чистым решением было бы использование другого инструмента создания настроек, который предлагает больший контроль над разрешениями.

8 голосов
/ 02 августа 2016
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);

        }

Приведенный выше код устанавливает права доступа к папке на полный контроль / чтение-запись для каждого пользователя (каждого).

3 голосов
/ 15 ноября 2013
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); 

Установка наследующей части также важна, если вы хотите сохранить и получить доступ к нескольким файлам в папке ProgramData.

3 голосов
/ 02 сентября 2011

Поведение - это дизайн.Программы не должны изменять себя (следовательно, их установочный каталог) для чего-либо, кроме обновлений (что снова может быть сделано с помощью установщика Windows без проблем).Если вы используете .NET, изолированное хранилище - отличное место для хранения пользовательских данных.

0 голосов
/ 20 ноября 2015

Как уже упоминалось выше, группа «Пользователи» не имеет разрешения на запись в программные файлы. Если вы не хотите иметь дело с классом установщика или Wix (если это простая программа), просто предпочтите установку программного обеспечения под Windows Volume.

Я говорю о Мастер установки Visual Studio : Изменить папку приложения ' DefaultLocation ' Свойство из [ProgramFilesFolder] в [WindowsVolume] [Производитель] [ProductName] в файловой системе на целевой машине.

...