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

Windows 使用WiX工具集设置ProgramData中现有文件夹和文件的权限,windows,permissions,wix,wix-extension,wix3.10,Windows,Permissions,Wix,Wix Extension,Wix3.10,我继承了一个使用WIX工具集(3.10.3)构建安装包的项目。应用程序下载共享数据并将其存储在c:\ProgramData\Vendor\ApplicationName中。但是,此路径不是在安装过程中创建的,而是在应用程序本身的执行过程中,每当第一次请求该路径时创建的 我现在发现了一个与权限相关的问题,当多个Windows用户使用该应用程序时会出现该问题。每当应用程序从后端下载新的数据文件时,当前的windows用户将获得这些文件的“完全控制”权限。当其他人使用其他Windows帐户登录时,他们

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

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

由于应用程序不需要提升权限,因此我必须在安装过程中更正此问题。作为第一步,我现在已经确保在安装过程中创建了
c:\ProgramData\Vendor\
文件夹,并且它获得了
的正确权限。由于这些权限是继承的,因此它将解决所有进行新安装的用户的问题


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

好的,我就是这样解决的。希望将来能帮助别人

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

<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文件夹中


有关文件/注册表虚拟化的更多信息可以在这里找到:

这对我来说很有效。注意:您不希望直接使用特殊用户组的名称,例如“已验证用户”,因为这些名称在本地化版本的Windows上不同。相反,wix中有特殊的硬编码字符串来表示这些特殊用户。即,对于“认证用户”,它将是“认证用户”。有关详细信息,请参见以下相关帖子: