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

sun*_*own 4 windows permissions wix wix-extension wix3.10

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

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

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

问题是权限仅由安装后创建的文件夹/文件继承。这意味着从先前版本升级的用户仍将保留具有混合权限的数据文件。因此,我需要确保所有现有文件夹和文件在安装过程中获得新权限。我该如何实现这个目标?

sun*_*own 9

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

首先,我将以下内容添加到 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> 
Run Code Online (Sandbox Code Playgroud)

然后包括它:

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

这三件事确保所有用户都可以完全访问 ProgramData 中的文件夹,即使该文件夹已经存在。

但是,如果文件虚拟化由于之前的权限问题而已经处于活动状态,那么更改权限是不够的。为了关闭文件虚拟化,我将 app.manifest 添加到我的可执行文件中:

<requestedExecutionLevel  level="asInvoker" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

请记住,如果以前使用的 VirtualStore 包含重要文件,它们将不会自动出现在 ProgramData 文件夹中。

有关文件/注册表虚拟化的更多信息可以在这里找到: https: //blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-保护区/