使用WiX工具集设置ProgramData中现有文件夹和文件的权限



我继承了一个使用WIX Toolset(3.10.3)构建安装包的项目。应用程序在c:ProgramDataVendorApplicationName中下载并存储共享数据。但是,该路径不是在安装过程中创建的,而是在应用程序本身的执行过程中,每当第一次请求该路径时创建的。

我现在发现了一个权限相关的问题,当多个Windows用户使用该应用程序时发生。每当应用程序从后端下载新的数据文件时,当前的windows用户就会获得这些文件的"完全控制"权限。当其他人用另一个Windows帐户登录时,他们只有读取这些文件的权限。当应用程序试图保持本地文件与后端文件同步时,这些混合权限会导致问题。

由于应用程序不需要提升特权,我必须在安装期间纠正这个问题。作为第一步,我现在已经确保在安装过程中创建了c:ProgramDataVendor文件夹,并且它获得了<util:PermissionEx User="Everyone" GenericAll="yes" />的正确权限。由于这些权限是继承的,因此它将为所有进行新安装的用户解决这个问题。

问题是只有在安装后创建的文件夹/文件才能继承权限。这意味着从以前版本升级的用户仍然拥有混合权限的数据文件。因此,我需要确保所有现有的文件夹和文件在安装期间获得新的权限。我该如何做到这一点?

好了,我就是这样解决的。希望它能在将来帮助到其他人。

首先,我将以下内容添加到MSI的wxs文件中:

<Directory Id="CommonAppDataFolder">
    <Directory Id="ProgramDataVendorFolder" Name="MyVendor">
        <!--This will create the ProgramDataMyVendorMyProductName 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/

相关内容

  • 没有找到相关文章

最新更新