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

4

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

Yan的建议

<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"属性解决了问题。 - Stephen Reindl
2个回答

6

这是一个简单的示例:

<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
谢谢Yan。这似乎可以运行并设置权限,但是当我通过文件属性中的安全选项卡检查权限时,我会收到此消息:“上传文件夹的权限顺序不正确,这可能导致某些权限无效”(upload是我的文件夹名称),有什么想法吗?唯一的区别是我添加了“GenericWrite =”yes“”用于第一个Permission node。 - roryok
嗯,我肯定记得我见过那样的警告,但我不记得确切是什么了...似乎与有效权限有关。如果我没记错的话,在高级安全区域内一定有一个“重新排序”的按钮。尝试点击它并查看有什么变化。 - Yan Sklyarenko
重新排序似乎只是修复权限。此外,上面的代码现在会在安装文件夹内的每个文件夹上设置这些权限,而不仅仅是上传文件夹。为了明确起见,我的“DirectoryRef”肯定是正确的文件夹,而不是根目录或其他愚蠢的东西。 - roryok
1
User="[SC_ASPNET_USERNAME]" Domain="[SC_ASPNET_DOMAIN]" 是什么?它们是系统默认用户吗?还是我们需要定义它们? - varun7447
你需要定义它们。这只是我一直在工作的项目的一个例子。 - Yan Sklyarenko

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

我们可以使用PermissionEx代替Permission。
这对我起作用。

2
使用“PermissionEx”的一个优点是它可以添加或修改基本权限,因此如果您想要添加一个小调整,就不需要复制它们。 "Permission"将所有权限替换为您的配置。 - Rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接