Xml WiX工具集:使用特定权限安装文件

Xml WiX工具集:使用特定权限安装文件,xml,permissions,wix,windows-installer,Xml,Permissions,Wix,Windows Installer,使用WiX,我想安装一个具有读写权限的文件(我甚至不知道Windows是否允许这种亵渎) 以下是我尝试过的: 我导入UtilExtension dll没有问题,因此访问and元素没有问题(我不知道是否只需要元素就需要dll,所以我添加了它) 从那以后,我尝试了每一种变化,使用了我能想到的这两种元素。下面是一个很简单的例子(注意在所有这些示例中,元素嵌套在元素中): 或者是这个?也许我需要将ChangePermissions属性设置为yes才能进行任何更改?(我找不到这方面的任何信息): 这里

使用WiX,我想安装一个具有读写权限的文件(我甚至不知道Windows是否允许这种亵渎)

以下是我尝试过的:

我导入UtilExtension dll没有问题,因此访问and元素没有问题(我不知道是否只需要元素就需要dll,所以我添加了它)

从那以后,我尝试了每一种变化,使用了我能想到的这两种元素。下面是一个很简单的例子(注意在所有这些示例中,
元素嵌套在
元素中):


或者是这个?也许我需要将ChangePermissions属性设置为yes才能进行任何更改?(我找不到这方面的任何信息):

这里有一个稍微复杂一点的问题——我不得不在这里指出并希望,因为文档太肤浅了,我不知道这些是否必要:

        <File Source="CAagentConfiguration.xml">
            <Permission User="administrator" 
                        ChangePermission="yes" 
                        GenericRead="yes" 
                        GenericWrite="no"/>
        </File>

或者我应该使用
元素,但它需要一个名为Sddl的属性,称为“应用于父对象的安全描述符”,我想用“直升机”来描述我的育儿风格(我不知道这个短语的意思)

雪上加霜的是,Intellisense只看到
的两个属性,即Ssdl和Id,尽管元素上的有一整套属性

我也在想,也许我需要将填充域名添加到用户属性中,所以我也这样做了,但没有成功

无论如何,我已经尝试了我能想到的一切,在安装后尝试打开文件时得到的唯一结果是:

这是令人振奋的,因为这意味着我实际上成功地更改了许可,但令人沮丧的是,这不是我想要的更改


WiX land中是否有人知道是否可以安装一个文件,以便用户可以读取该文件,但不能写入该文件?

您可以直接跳到下面的技术答案,但我想先谈谈ACL:-)

最短可能答案:本质上,这可能只是一个“拒绝ACL条目”覆盖“读取授权ACL条目”。相反,应该删除“write grant ACL条目”,并且不应该添加拒绝条目。ACL继承可能必须禁用

用写的方法,考虑当你需要奇怪的ACL许可时,你的部署设计可能有什么错误。更多详情见下文


ACL的阴暗世界 从前。。。只是开玩笑。写这个“布道”感觉很奇怪,但是我写了一个ACL许可组件,用于MSI在C++中使用过一次-它是相当毛茸茸的,我建议尽可能远离许可。使用或使用它并非不可能,但它很容易出错。一个复杂问题是ACL和许可证的继承量。我制作了一些疯狂的“海报”来处理这些ACL/DACL问题。我希望我还拥有它们。正如我所记得的,否认权利优先于授予权利存在一些问题。有很多陷阱

因此,像这样应用自定义权限是触发MSI运行时错误的一种很好的方法,这些错误很难处理(也可能是应用程序错误)——我想提一下。众所周知,ACL许可很容易搞乱,您需要彻底测试升级、修补和卸载场景以普通用户的身份运行(具有提升MSI安装权限的托管环境),以真正的管理员用户的身份运行,或远程触发卸载(以系统用户的身份运行)或者你可能会遇到非常糟糕的惊喜

我相信WiX的人已经增加了对最坏陷阱的保护,但我仍然会避免ACL许可-这是一种反部署模式,表明在大多数情况下(以我的经验,在所有情况下,让我们说几乎所有情况下)应用程序设计有问题。我在这里的一个相当混乱的摘要中写了关于部署反模式的内容,请参见第14节:

有鉴于此,我只想问一些问题(当我对您的情况有了更好的了解后,我将尝试跟进):

  • 您能否在应用程序启动时从数据库中检索这些设置,从而更好地使用这些设置?(客户端/服务器应用程序)。您可以获得集中化的设置管理,并且可以随时更改配置。如果定义“角色”,甚至可以为不同的用户组设置不同的设置。没有讨厌的文件要处理。对于所有的用户数据,我更喜欢这样——主观的注释。避免所有漫游配置文件和与文件有关的存储问题。不过,网络连接是一个问题。您可能仍然需要缓存文件。。。或者,如果没有网络连接,应用程序就无法工作——我想这对于客户端/服务器来说是正常的
  • 请注意一般发行版第三方应用程序的网络访问要求。如果应用程序除了通过代理(当然,您必须检测)之外没有通用网络访问权限,则可能会遇到代理问题
  • 如果您不想对文件进行任何更改,是否可以在应用程序中改为“内部默认设置”?只是源代码中指定的设置,而不是配置文件?配置文件的存在表明需要在外部配置某些东西-这种需要真的存在吗?(我想是的,只是检查一下)。您始终可以重建二进制文件以更改设置和重新部署?这可能适用于内部公司应用程序。不过不太好。您可以在注册表中设置一个标志,并允许配置文件在设置标志时覆盖磁盘上的默认值?
  • <File Source="CAagentConfiguration.xml"> <Permission User="administrator" ChangePermission="yes" GenericRead="yes" GenericWrite="no"/> </File>