如何使用Wix安装程序递归地将文件权限应用于现有文件夹



我们为应用程序创建了一个使用Wix3.5的安装程序。我们的应用程序的用户在通用应用程序数据文件夹中有现有数据,我们希望"修复"这些数据的权限,以便我们的用户不再需要在其电脑上担任管理员。

因此,在安装过程中,我将以下部分添加到Wix项目中,以便它修改我们的文件夹权限。这对新用户非常有效,但这些文件夹中的任何现有文件仍保留旧ACL,不允许非管理员用户读取/修改它们。

  <Directory Id="CommonAppDataFolder">
    <Directory Id="CommonAppOurCompany" Name="OurCompany">
      <Directory Id="MODELLIBPATH" Name="Library">
        <Component Id="LibraryUserPermissions" Guid="12BC499B-4601-449F-9515-4C58A8F29603">
          <CreateFolder>
            <util:PermissionEx GenericRead="yes" GenericWrite="yes" GenericExecute="yes" Delete="yes" DeleteChild="yes" User="Users" Domain="[MachineName]"/>
          </CreateFolder>
        </Component>
      </Directory>
    </Directory>
  </Directory>

我可以做些什么来递归地将新ACL应用于文件夹及其子文件夹中的每个文件,而不删除或修改文件(除了它们的安全设置)?

通常情况下,安装程序会创建并设置权限,以便继承新的文件夹和文件。在您的情况下,您需要编写一个自定义操作来调用cacls或类似递归结构并应用权限。据我所知,MSI或WiX没有内置的能力来做到这一点。

Folder permission:
<ComponentGroup Id="" Directory="" Source="">
  <Component Id="CompID" Guid="*">
    <CreateFolder>
      <Permission User="Administrators" GenericAll="yes"/>
      <Permission User="Users" GenericAll="no" GenericRead="yes" GenericExecute="yes"/>
      <---- keep adding required user permission --->
    </CreateFolder>

文件权限:有点棘手。我尝试在Customaction中使用Cacl.exe,但没有帮助。首先,您需要删除现有文件以清除现有ACL,然后创建新文件:

<RemoveFile Id="fileID" Name="FileName" On="both" />
    <File Id ="fileID" KeyPath="yes">
      <Permission User="Administrators" GenericAll="yes"/>
      <Permission User="Users" GenericAll="no" GenericRead="yes" GenericExecute="yes" GenericWrite="no"/>
    </File>
  </Component>
</ComponentGroup>

最新更新