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

时间:2014-12-18 12:37:21

标签: permissions wix directory custom-action

我正在使用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> 

2 个答案:

答案 0 :(得分:5)

这是一个简单的样本:

<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>

这是一个快速解释:

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

答案 1 :(得分:2)

            <CreateFolder>
                    <Permission User="Users" GenericAll="yes" />
                    <Permission User="Administrators" GenericAll="yes" />
                </CreateFolder>

我们可以使用PermissionEx代替Permission。

它为我工作。