Установите разрешения для существующих папок и файлов в ProgramData с помощью WiX Toolset

Я унаследовал проект, который использует WIX Toolset (3.10.3) для сборки установочного пакета. Приложение загружает и хранит общие данные в c:\ProgramData\Vendor\ApplicationName, Однако этот путь создается не во время установки, а во время выполнения самого приложения, каждый раз, когда путь запрашивается в первый раз.

Теперь я обнаружил проблему, связанную с разрешениями, которая возникает, когда приложение используют несколько пользователей Windows. Всякий раз, когда приложение загружает новые файлы данных из серверной части, это текущий пользователь Windows, который получает разрешения "Полный контроль" для этих файлов. Когда кто-то входит в систему с другой учетной записью Windows, он имеет права только на чтение этих файлов. И эти смешанные разрешения вызывают проблемы, когда приложение пытается синхронизировать локальные файлы с серверной частью.

Поскольку приложение не требует повышенных привилегий, я должен исправить это во время установки. В качестве первого шага я убедился, что c:\ProgramData\Vendor\ папка создается во время установки, и что она получает правильные разрешения с <util:PermissionEx User="Everyone" GenericAll="yes" />, Поскольку эти разрешения наследуются, это решит проблему для всех пользователей, выполняющих новую установку.

Проблема в том, что разрешения наследуются только папками / файлами, созданными после установки. Это означает, что у пользователей, которые выполняют обновление с предыдущей версии, по-прежнему будут оставаться файлы данных со смешанными разрешениями. Поэтому мне нужно убедиться, что все существующие папки и файлы получают новые разрешения во время установки. Как мне это сделать?

1 ответ

Решение

Хорошо, вот как я это решил. Надеюсь, что это может помочь кому-то еще в будущем.

Сначала я добавил следующие вещи в файл wxs для MSI:

<Directory Id="CommonAppDataFolder">
    <Directory Id="ProgramDataVendorFolder" Name="MyVendor">
        <!--This will create the \ProgramData\MyVendor\MyProductName\ folder. -->
        <Directory Id="ProgramDataAppFolder" Name="MyProductName" />
    </Directory>
</Directory>

<DirectoryRef Id="ProgramDataAppFolder">
<Component Id="CmpCreateCommonAppDataFolderWithPermissions" Guid="13ae94b7-9ef5-4181-bfa9-933844a13418" Permanent="yes">
  <CreateFolder>
    <!--This will ensure that everyone gets full permissions to the folder that we create in the ProgramData folder. -->
    <util:PermissionEx User="Everyone" GenericAll="yes" />
  </CreateFolder>
</Component>  
</DirectoryRef> 

А потом включил его:

<Feature Id="ProductFeature" Title="$(var.ProductName)" Level="1">
    <!--Add folder -->
    <ComponentRef Id="CmpCreateCommonAppDataFolderWithPermissions" />
</Feature>

Эти три вещи гарантировали, что все пользователи имели полный доступ к папке в ProgramData, даже если папка уже существует.

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

<requestedExecutionLevel  level="asInvoker" uiAccess="false" />

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

Более подробную информацию о виртуализации файлов / реестра можно найти здесь: https://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-protected-area/

Другие вопросы по тегам