我们为应用程序创建了一个使用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>