1

我们使用 WiX 将我们的 ASP.NET 代码捆绑到一个 MSI 安装程序中,我们需要设置 [ComputerName]\IIS_WPG 组以对安装目录下的文件夹(名为“CO”)具有修改权限。安装后目录结构如下

C:\inetpub\wwwroot\MyApp\CO

CO 文件夹实际上是 .NET 解决方案文件的一部分,当应用程序捆绑到 MSI 中时,会自动包含 CO 文件夹,因为它下面有标记为“内容”的 XML 文件(这意味着我没有不需要显式使用 CreateFolder 在 MyApp 下创建 CO 文件夹)。这些 XML 文件由应用程序更新,这就是 IIS_WPG 需要修改权限的原因。

我的问题是,如何设置 CO 文件夹的权限?我认为我可能能够创建文件夹以尝试覆盖默认包含的任何权限,但它没有设置权限 - 我猜这是因为我正在创建的文件夹被实际文件夹覆盖MSI,从而覆盖我设置的权限。

我认为我可能需要创建一个在 InstallFinalize 之前的某个时间点执行的 CustomAction,但我迷路了,因为我不明白如何将文件夹创建链接到 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 正常工作并且文件夹权限正确?

4

2 回答 2

0

你的设置和我的很像,差别不大。

我们不在自定义操作中设置权限,而是在创建目录时设置权限。

这对我们有用:

<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>
于 2013-07-12T12:38:57.633 回答
0

我必须创建一个 CustomAction,类似于这篇文章中所做的

使用 cacls 设置权限

我知道这并不理想,但它解决了问题。我们可能会升级到 Wix 3 并使用 PermissionEx,但这是一场我将不得不在另一天进行的战斗。

不确定它是否有帮助,但我做了更多调查,发现我们使用的是 Wix 2,所以我猜这就是我们不能使用 PermissionEx 的原因。

于 2013-07-15T03:52:02.967 回答