Подтвердить что ты не робот

Как предоставить разрешения на чтение/запись в папку во время установки с помощью .NET.

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

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

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

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

Этот очевидный параметр разрешений по умолчанию будет происходить независимо от того, устанавливает ли пользователь приложение как "Администратор" или нет.

Мне кажется странным, что установщик не дает разрешения "Write" для папки, которая используется установленным приложением, - это еще более запутанно, что папка, созданная установщиком в ProgramData папка для базы данных приложения не получает разрешения "Написать".

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

То, что нужно сделать, - это сделать индивидуальное действие. Это довольно просто, ознакомьтесь с прохождением MSDN для написания пользовательского действия С# здесь. Вы внесете свой код смены разрешения в метод установки:

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

Фактически установка привилегий для чтения/записи для пользователей была немного сложнее, и самым близким, что я мог получить, было установить для Authenticated Users. Я собрал несколько других решений, которые я нашел в Интернете, чтобы придумать это:

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 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 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]"

Ответ 3

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

        }

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

Ответ 4

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

Ответ 5

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.

Ответ 6

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

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

Ответ 7

Я предполагаю, что это зависит от операционной системы сервера, и строят ли вы код на том же сервере, на котором вы развертываете, или на удаленном?

Самое простое - добавить команду xcopy в пакетный файл и после xcopy включить следующее:

cacls c:\[PathToWebsite]\[ChartImagesFolder] /E /G [AccountSiteRunsUnder]:C

Или более поздний вариант (я не использовал это, поэтому мои параметры могут быть отключены):

icacls c:\[PathToWebsite]\[ChartImagesFolder] /grant [AccountSiteRunsUnder]:M

В принципе, любой из них должен указывать учетную запись пользователя, что сайт работает в соответствии с правами на изменение (изменение) в указанной папке. Это должно быть в дополнение к любым существующим правам в папке, есть модификаторы или переключатели для замены существующих прав.

Если вы развертываете на удаленном сервере, вам понадобится какой-то механизм для запуска команд там, мы обнаружили, что PSExec (часть инструментов PS из SysInternals).