Установить права доступа по умолчанию для папки, созданной в пользовательском установщике

Я создал простой пользовательский установщик, как описано здесь . Мой новый установщик работает должным образом. Он создает папку и добавляет путь в файл app.config.

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

Если я вручную создаю папку и устанавливаю разрешения, они сбрасываются при запуске установщика.

Как я могу указать эти параметры в моем пользовательском установщике?

РЕДАКТИРОВАТЬ:

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

// Get the directory info for the existing folder
DirectoryInfo dirInfo = new DirectoryInfo(settingsFileDir);

// Now apply user access permissions to the folder
if (dirInfo != null)
{
    DirectorySecurity security = dirInfo.GetAccessControl();
    security.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));
    security.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
    dirInfo.SetAccessControl(security);
}

Когда я пытаюсь установить атрибуты папки, чтобы удалить параметр только для чтения, никаких изменений не происходит. Я делаю это с помощью:

dirInfo.Attributes = FileAttributes.Normal;

person TeamWild    schedule 04.01.2012    source источник


Ответы (2)


Использование приведенного ниже кода фактически устанавливает права доступа к папке.

// Get the directory info for the existing folder
DirectoryInfo dirInfo = new DirectoryInfo(settingsFileDir);

// Now apply user access permissions to the folder
if (dirInfo != null)
{
    DirectorySecurity security = dirInfo.GetAccessControl();
    security.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));
    security.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
    dirInfo.SetAccessControl(security);
}

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

Свойства тестовой папки

person TeamWild    schedule 06.01.2012

Чтобы изменить разрешения, вы можете попробовать использовать XCACLS.EXE как настраиваемое действие.

Чтобы изменить атрибут только для чтения, вы можете использовать настраиваемое действие с настраиваемым кодом. Вот статья, которая может помочь: http://blogs.technet.com/b/heyscriptingguy/archive/2004/10/19/how-can-i-change-a-read-only-file-to-a-read-write-file.aspx

person cosmin    schedule 04.01.2012
comment
Я не уверен, что использование внешнего приложения - лучший выход. Это потребует, чтобы оно было отправлено с моим приложением, и, похоже, оно может не работать с более новыми ОС. - person TeamWild; 05.01.2012
comment
Какой инструмент вы используете для создания MSI? - person cosmin; 05.01.2012
comment
Visual Studio 2008. Я создал класс установщика настраиваемых действий для применения пути к файлу в файле app.config и последующего перемещения всех существующих файлов в эту папку. - person TeamWild; 05.01.2012
comment
Проекты установки Visual Studio не поддерживают разрешения для папок. Итак, вам нужно настраиваемое действие или другой инструмент для создания настроек. Кроме того, не рекомендуется перемещать установленные файлы во время установки. - person cosmin; 05.01.2012