Wix:使用permissionEx设置安装文件夹中文件夹的权限

Posted

技术标签:

【中文标题】Wix:使用permissionEx设置安装文件夹中文件夹的权限【英文标题】:Wix: Set permission of a folder within the installfolder using permissionEx 【发布时间】:2015-02-17 06:03:06 【问题描述】:

我正在使用 Wix 为 ASP.NET MVC Web 应用程序创建安装程序,并且我需要在站点中的特定文件夹上设置 IIS_WPG 的写入权限。我找到了一个如何使用 cacls.exe 执行此操作的示例(我认为,它仍然无法正常工作):

<CustomAction Id="PermissionAppData" Directory="TARGETDIR" 
  ExeCommand="&quot;[SystemFolder]cacls.exe&quot; 
  &quot;[INSTALLDIR]\Content\uploads&quot; 
  /T /E /G IIS_WPG:M" Return="check" />

但是,我听说PermissionEx 更好,因为它修改 ACL 而不是覆盖,(尽管这里的 /E 修饰符声称做同样的事情?)所以如果可能的话,我更愿意使用它。我可以找到的唯一示例 PermissionEx 设置安装目录和所有子文件夹的权限 - 我不想这样做。

如何使用PermissionEx 修改我的安装文件夹中的单个文件夹的权限?

更新

好的,这就是我目前所得到的 - 基于下面 Yan 的回答和网上的一些其他示例

我的文件夹结构....

<Fragment>
    <!-- Will default to C:\ if that is the main disk-->
    <Property Id="ROOTDRIVE"><![CDATA[C:\]]></Property>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <!-- Will reference to C:\inetpub-->
        <Directory Id="INETPUB" Name="Inetpub">
            <!-- Will reference to c:\Inetpub\wwwroot-->
            <Directory Id="WWWROOT" Name="wwwroot">
                <!-- Will reference to c:\Inetpub\wwwroot\Demowebsite-->
                <Directory Id="INSTALLFOLDER" Name="DemoWebsite">
                    <Directory Id="CONTENT" Name="Content">         
                        <Directory Id="UPLOAD" Name="upload">
                        </Directory>         
                    </Directory>                                     
                </Directory>
            </Directory>
        </Directory>
    </Directory>
</Fragment>

颜的建议

<Fragment>
    <DirectoryRef Id="UPLOAD">
      <Component Id="SetFolderPermissions" Guid="*">
        <CreateFolder>
           <util:PermissionEx GenericRead="yes" GenericExecute="yes" User="[SC_IUSR_USERNAME]" Domain="[SC_IUSR_DOMAIN]"/>
     <util:PermissionEx GenericRead="yes" GenericExecute="yes" GenericWrite="yes" Delete="yes" User="[SC_ASPNET_USERNAME]" Domain="[SC_ASPNET_DOMAIN]"/>
  </CreateFolder>
      </Component>
    </DirectoryRef>
</Fragment> 

这似乎无济于事。没有为 IIS_IUSRS 帐户设置权限。我也从trycatchfail尝试过这个解决方案

<Product>
    <!-- rest of product code removed for brevity -->
    <Property Id="WEBUSER" Value="Byah" />
    <Property Id="WEBDOMAIN" Value="Byah" />

    <CustomAction Id="SetWebuserIIS7" Return="check" Property="WEBUSER" Value="IIS_IUSRS" />
    <CustomAction Id="SetWebuserIIS6" Return="check" Property="WEBUSER" Value="IUSR_[ComputerName]" />
    <CustomAction Id="SetDomainIIS7" Return="check" Property="WEBDOMAIN" Value="" />
    <CustomAction Id="SetDomainIIS6" Return="check" Property="WEBDOMAIN" Value="[ComputerName]" />
</Product>

<Fragment>
  <DirectoryRef Id="UPLOAD">
  <Component Id="SetFolderPermissions" Guid="*">
    <CreateFolder>
      <util:PermissionEx User="NetworkService" GenericAll="yes" />
      <util:PermissionEx User="Administrators" GenericAll="yes" />
      <util:PermissionEx User="Users" GenericRead="yes" GenericExecute="yes"  />
      <util:PermissionEx User="[WEBUSER]" Domain="[WEBDOMAIN]"  GenericAll="yes" />
    </CreateFolder>
  </Component>
</DirectoryRef>
</Fragment> 

【问题讨论】:

我记得过去也遇到过这个问题。当时我们做了很多改变,但据我所知, Traverse="yes" 属性起到了作用。 【参考方案1】:

这是一个简单的示例:

<DirectoryRef Id="WebsiteFolder">
   <Component DiskId="1" Id="DummyComponentForPermissionsWebsite" Guid="GUID-GOES-HERE">
      <CreateFolder>
         <util:PermissionEx GenericRead="yes" GenericExecute="yes" User="[SC_IUSR_USERNAME]" Domain="[SC_IUSR_DOMAIN]"/>
         <util:PermissionEx GenericRead="yes" GenericExecute="yes" GenericWrite="yes" Delete="yes" User="[SC_ASPNET_USERNAME]" Domain="[SC_ASPNET_DOMAIN]"/>
      </CreateFolder>
   </Component>
</DirectoryRef>

这里有一个简单的解释:

上面的示例假定在某处定义了 &lt;Directory&gt;Id="WebsiteFolder" &lt;CreateFolder&gt; 元素是必需的,因为此组件中没有其他元素。您可以轻松地将&lt;util:PermissionEx&gt; 元素添加到包含文件、注册表值等的其他组件中。 当然,上面的组件必须是功能的一部分 根 WiX 元素必须引用 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" 命名空间 编译时必须引用WixUtilExtension

【讨论】:

谢谢严。这似乎运行并设置了权限,但是当我通过文件属性中的安全选项卡检查权限时,我收到此消息The permissions on upload are incorrectly ordered, which may cause some permissions to be ineffective(上传是我的文件夹的名称),有什么想法吗?唯一的区别是我为第一个权限节点添加了GenericWrite="yes" 嗯,我绝对记得我见过这样的警告,但我不记得它到底是什么......似乎它与有效权限有关。如果我没记错的话,高级安全区域内一定有一个“重新排序”按钮。尝试点击它,看看有什么变化。 重新排序似乎只是修复了权限。此外,上面的代码现在对安装文件夹中的每个文件夹设置这些权限,而不仅仅是上传文件夹。需要明确的是,我的 DirectoryRef 绝对是正确的文件夹,而不是根目录或类似的傻瓜 User="[SC_ASPNET_USERNAME]" Domain="[SC_ASPNET_DOMAIN] 是什么?他们是系统默认用户吗?还是我们需要定义它们? 您需要定义它们。这只是我一直在做的项目的一个例子。【参考方案2】:
<CreateFolder>
    <Permission User="Users" GenericAll="yes" />
    <Permission User="Administrators" GenericAll="yes" />
</CreateFolder>

我们可以使用 PermissionEx 代替 Permission。

它对我有用。

【讨论】:

使用“PermissionEx”的一个优点是它可以添加或修改基本权限,因此如果您想添加一个小调整,则无需复制它们。 “权限”用您的配置替换所有权限。

以上是关于Wix:使用permissionEx设置安装文件夹中文件夹的权限的主要内容,如果未能解决你的问题,请参考以下文章

使用 WiX 中的在线设置安装 .NET 框架

使用 wix 安装程序,当用户在编辑框中输入内容时安装时我如何在设置过程中覆盖配置文件

WiX 引导程序创建的安装程序未启动

如何获取用户在安装 WIX 设置时输入的属性值?

WiX - 从上一个对话框设置属性

我如何在 WiX 安装程序脚本中实际使用 LinkerBindInputPaths PropertyGroup