Wix:如何设置文件夹及其所有子文件夹的权限

44

我知道如何设置文件夹的权限:

<DirectoryRef Id="ProgramFilesFolder">
  <Directory Id="PHPFolder" Name="PHP">
    <Component Id="PHP_comp" DiskId="1" Guid="*">
      <CreateFolder>
        <Permission User="Everyone" GenericAll="yes" />
      </CreateFolder>

不过我需要权限也应用到所有子文件夹中。不用列出所有文件夹,这可能吗?

3个回答

42

首先,我建议您使用PermissionEx。它是一个标准的WiX扩展,相比于Permission有一个巨大的优势——它不会覆盖ACLs,而是修改它们。默认情况下,它将权限应用于文件夹及其所有后代文件和文件夹,因此您不必额外指定任何内容。

希望这可以帮到您。


3
您能提供一个PermissionEx的例子吗?我正在CreateFolder标签中使用它,但是我收到了错误“所需的SDDL属性丢失”。我还有User和GenericAll属性,会出现“未声明属性”错误。谢谢。 - Be.St.
8
那是因为你正在使用标准的PermissionEx元素,它从MSI 5.0开始受支持。它具有不同的签名,并且期望SDDL属性。你应该像这样包含UtilExtensionxmlns:util="http://schemas.microsoft.com/wix/UtilExtension 并像这样引用它:<util:PermissionEx> - Yan Sklyarenko
我在阅读你的评论之前就写了回复。非常感谢。 - Be.St.
1
很好,帮了我。在<File>标签内使用它。 - anhoppe
@YanSklyarenko 考虑从评论中添加额外信息来更新您的答案。人们不应该需要阅读评论才能理解整个情况。此外,您的回答相当简洁,一个示例会有所帮助。 :) - Macke

36
我解决了一个问题:在Wix和Util schema中定义了不同的PermissionEx(Wix PermissionExUtil Extension PermissionEx)。
我使用了Util版本:
  • 添加对WixUtilExtension程序集的引用
  • 将UtilExtension命名空间添加到Wix标记中:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  • 指定 Util PermissionEx 版本:
<CreateFolder Directory="DirectoryToManage">
    <util:PermissionEx User="Users" GenericAll="yes" />
</CreateFolder>

27
<DirectoryRef Id="INSTALLFOLDER">
        <Component Id="INSTALLFOLDER_Permission" Guid="*">
            <CreateFolder>
                <util:PermissionEx User="Users" GenericAll="yes"/>
            </CreateFolder>
        </Component>
    </DirectoryRef>

上面的答案是正确的,您将设置此文件夹中所有文件和文件夹的权限。

请注意:CreateFolder标记应位于组件中,并且必须将此组件添加到功能中。

此外,您还需要将其添加到编译器链接器的命令行中:

-ext WixUIExtension -ext WixUtilExtension

2
使用PermissionEx时,不需要添加对WixUIExtension的引用,但是为了让像我这样的WiX新手理解如何添加,给出命令行参数是个好主意。 - zagrimsan
他这样做是因为他正在使用WixUIExtension中指定的PermissionEx,而不是基于纯MSI的PermissionEx,后者需要将SDDL作为属性。它们的名称相同,但非常不同。 - Wes
我需要在任何地方引用该组件ID INSTALLFOLDER_Permission吗? - codenamezero
无法编译。这里是错误信息:Component / @Guid 属性的值“*”对于此组件无效,因为它不符合自动生成 GUID 的标准。使用目录作为 KeyPath 或包含 ODBCDataSource 子元素的组件不能使用自动生成的 GUID。(...) - daniol

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