我们使用WiX将ASP.NET代码捆绑到MSI安装程序中,并且我们需要将[ComputerName]\IIS_WPG组设置为对安装目录下的文件夹(名为"CO")具有修改权限。安装后的目录结构如下
C:inetpubwwwrootMyAppCO
CO文件夹实际上是.NET解决方案文件的一部分,当应用程序绑定到MSI中时,CO文件夹会自动包含在内,因为它下面有标记为"内容"的XML文件(这意味着我不需要显式使用CreateFolder在MyApp下创建CO文件夹)。这些XML文件由应用程序更新,这就是IIS_WPG需要修改权限的原因。
我的问题是,如何设置CO文件夹的权限?我想我可以创建文件夹,试图覆盖默认情况下包含的任何权限,但它没有设置权限——我猜这是因为我正在创建的文件夹被MSI中的实际文件夹覆盖,从而覆盖我设置的权限。
我想我可能需要创建一个CustomAction,它会在InstallFinalize之前的某个时刻执行,但我迷路了,因为我不知道如何将文件夹创建链接到CustomAction。我试过这个
<InstallExecuteSequence>
<Custom Action="SetPermission" Before="InstallFinalize" />
</InstallExecuteSequence>
<CustomAction Id="SetPermission" Directory="CODIRECTORY">
<Directory Id="CODIRECTORY" Name="CO" LongName="CO">
<Component Id="CODIR" Guid="D28C9DA4-D20F-45E6-9C9B-4687177EDF41" DiskId="1">
<CreateFolder>
<Permission GenericAll="yes" User="[ComputerName]IIS_WPG" />
<Permission GenericAll="yes" User="Administrators" />
<Permission GenericRead="yes" GenericWrite="yes" User="ASPNET" />
</CreateFolder>
</Component>
</Directory>
</CustomAction>
但这给了我这个错误
error CNDL0049 : The CustomAction element's DllEntry, Error, ExeCommand, JScriptCall, Script, Value, or VBScriptCall attribute was not found; one of these is required.
error CNDL0005 : The CustomAction element contains an unexpected child element 'Directory'
我也尝试过使用PermissionEx,但在使用时出现了这个错误
error CNDL0005 : The CreateFolder element contains an unexpected child element 'util:PermissionEx'.
尽管我添加了xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"在文件顶部。
如何使CustomAction正常工作并且文件夹权限正确?
您的设置看起来与我的非常相似,差别不大。
我们不在自定义操作中设置权限,而是在创建目录时设置权限。
这一款适用于我们:
<Directory Name="SourceDir" Id="TARGETDIR">
<Directory Id="CommonAppDataFolder">
<Directory Name="$(var.InstallCompany)" Id="CompanyDir">
<Directory Name="$(var.InstallProduct)" Id="ProductDir">
<Directory Name="$(var.InstallFolder)" Id="INSTALLLOCATION">
<Component Id="Permission.InstallFolder" Guid="{7C5234ED-EE92-468A-A765-27E5747705DB}">
<CreateFolder>
<Permission ChangePermission="yes" GenericAll="yes" User="Administrators"/>
<Permission User="Everyone" WriteExtendedAttributes="yes" WriteAttributes="yes" CreateFile="yes" CreateChild="yes" GenericWrite="no" GenericRead="yes" GenericExecute="yes"/>
</CreateFolder>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
我必须创建一个CustomAction,类似于本文中所做的操作
使用cacls 设置权限
我知道这并不理想,但它解决了问题。我们可能会升级到Wix 3并使用PermissionEx,但这是一场我必须改天再打的战斗。
不确定这是否有帮助,但我做了更多的调查,发现我们正在使用Wix 2,所以我猜这就是我们不能使用PermissionEx的原因。