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

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

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

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

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


person sundown    schedule 25.10.2016    source источник


Ответы (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/

person sundown    schedule 01.12.2016
comment
У меня это сработало. Примечание: вы не хотите напрямую использовать имя специальной группы пользователей, например, «Прошедшие проверку», поскольку они различаются в локализованных версиях Windows. Вместо этого в wix есть специальные жестко запрограммированные строки для представления этих особых пользователей. Т.е. для прошедших проверку пользователей это будет AuthenticatedUser. Подробнее см. В этих связанных сообщениях: stackoverflow.com/a/1535494/495262 sourceforge.net/p/wix/mailman/message/20188763 - person Matt Smith; 26.07.2019