WiX工具集:安装具有特定权限的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WiX工具集:安装具有特定权限的文件相关的知识,希望对你有一定的参考价值。

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

这是我尝试过的:

我没有任何问题导入UtilExtension DLL,所以我可以轻松访问<Permission />和<PermissionEx />元素(我不知道是否只需要<Permission />元素的dll,所以我添加它无论如何)。

从那里开始,我尝试了使用这些元素的每个变体,我能想到的。这是一个很简单的(注意,在所有这些例子中,<File/>元素嵌套在<Component/>元素中):

        <File Source="CAagentConfiguration.xml">
            <Permission User="administrator" 
                        Read="yes" 
                        Write="no"/>
        </File>

或者也许这一个?也许我需要将ChangePermissions属性设置为yes以实现任何更改? (我找不到任何关于这个):

这是一个稍微复杂一点 - 我被迫在这里戳戳和希望,因为文档很浅,我不知道这些是否必要:

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

或许我应该使用<PermissionEx/>元素,但它需要一个名为Sddl的属性,描述为“应用于父对象的安全描述符”,其中我想把“直升机”作为我父母养育方式的描述(我有不知道这句话是什么意思)。

为了增加对伤害的侮辱,Intellisense只看到<PermissionEx/>,Ssdl和Id的两个属性,尽管元素上的documentation具有许多属性。

我也在想,也许我需要将填充域用户名添加到User属性中,所以我也这样做,但无济于事。

在任何情况下,我都尝试了我能想到的一切,并且在安装后尝试打开文件时得到的唯一结果是:

enter image description here

这令人鼓舞,因为这意味着我成功地实际改变了许可,但令人沮丧,因为这不是我想要的改变。

有没有人在WiX-land中知道是否可以安装一个文件,以便用户可以读取文件而不是写入文件?

答案

你可以直接跳到下面的技术答案,但我首先想谈谈ACL的一些事情:-)。

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

编写完成后,在需要奇怪的ACL权限时,请考虑部署设计可能出现的问题。更多细节如下。


ACL的黑暗世界

曾几何时......开玩笑吧。写这篇“布道”感觉很奇怪,但是我曾经在C ++中为MSI编写了一个ACL权限组件 - 它非常多毛,我建议尽可能远离许可。使用或使用它并非不可能,但它非常容易出错。一个复杂因素是ACL和权限的“继承”数量。我做了一些疯狂的“海报”,以便在当天回复这些ACL / DACL问题。我希望我还有它们。我记得有一些关于拒绝权利优先于授予权的问题。有很多陷阱。

因此,应用这样的自定义权限是触发非常难以处理的MSI运行时错误的好方法(也可能是应用程序错误) - 只是想提一下。众所周知,ACL权限很容易搞砸,您需要测试升级,修补和卸载方案作为常规用户(具有提升的MSI安装权限的托管环境),以真实管理员用户身份运行或远程触发卸载(作为系统用户)或者你可能会遇到非常令人讨厌的惊喜。

我确信WiX的人已经增加了防止最严重陷阱的保护,但我仍然会避免ACL许可 - 这是部署的反模式,表明在大多数情况下应用程序设计有问题(根据我的经验,在所有情况下,让我们说差不多所有)。我在这里写了关于部署反模式的相当混乱的摘要,请参阅第14节:How do I avoid common design flaws in my WiX / MSI deployment solution?

鉴于此,我只想提出一些问题(当我对你的情况有更好的理解时会尝试跟进):

  • 您可以在应用程序启动时从数据库中检索这些设置并且更好吗? (客户端/服务器应用程序)。您可以获得集中式设置管理以及在需要时更改配置的良好能力。如果定义“角色”,您甚至可以为不同的用户组设置不同的设置。没有讨厌的文件要处理。我更喜欢这个用于所有用户数据 - 主观说明。避免混乱文件的所有漫游配置文件和存储问题。但网络连接是一个问题。您可能仍然需要缓存文件...或者应用程序在没有网络连接的情况下无法正常工作 - 无论如何我认为这对客户端/服务器来说是正常的。
  • 请注意一般分发第三方应用程序的网络访问要求。除了通过代理(当然必须检测到代理)之外,您可能会遇到没有通用网络访问权限的应用程序的代理问题。
  • 如果您根本不想对文件进行任何更改,您是否可以在应用程序中将这些设置设置为“内部默认值”?只是在源代码中指定的设置而不是配置文件?配置文件的存在表明需要在外部配置 - 这需要真的存在吗? (我认为它确实如此,只是检查)。您可以随时重建二进制文件以更改设置并重新部署吗?这可能适用于内部企业应用程序。虽然不是很好。您可以在注册表中设置一个标志,并允许配置文件覆盖默认设置(如果设置了标志时存在于磁盘上)?
  • 你在哪里安装这个文件?如果你在ProgramFilesFolder下安装 - 以正常方式 - 那么普通用户将首先没有对该文件的写访问权。如果管理员以提升的权限运行,他们可能会。我不确定文件是否写入是多么重要。一定是至关重要的?所以你想拒绝管理员写访问权限?
  • 你能掩盖文件,看起来像其他东西吗?也许加密它来混淆配置数据?是否可以切换到可以部署修补程序的二进制格式而无需重建整个应用程序?也许只加密你想要保护的实际XML文件值?或者使用无法篡改的二进制文件,因为源知道它的哈希值?

总而言之,安装到自然写保护的位置,删除配置文件并从数据库读取(在网络启动时您可以完全控制并立即部署到所有人),模糊文件的内容或制作它二进制,消除文件并在源代码中进行硬编码设置。这可能对你的情况都很生气 - 我知道这一点,但请仔细检查选项。选择你可以处理的复杂性,而不是太多的未知和风险特征?


技术解答(尝试)

现在针对实际的技术问题。您能否向我们展示属性屏幕,其中包含相关文件的ACL信息? Right click file => Properties => Security。它说什么?这是一个示例对话框,用挪威语,但你得到的图片。我们需要详细了解此对话框显示的内容。特别是我们需要知道是否有任何拒绝条目(下面最右边的列 - 挪威语中的“Avslå”意思是“拒绝”):

enter image description here

我会玩这个对话框并更改设置,直到它表现得像你期望的那样。首先删除所有拒绝权限,然后确定继承权限如何影响文件或对象的实际安全状态。使用右键单击并“运行方式...”在您需要的测试上下文中运行Notepad.exe或其他一些文本查看器 - 另一个用户(您似乎已经在做)。

“高级”按钮将转到一个对话框,您可以在其中混淆ACL的“继承”设置。换句话说,如果父对象的ACL适用于您选择要查看的对象。

在任何情况下,您都不得对LOCALSYSTEM或SYSTEM或任何帐户调用任何拒绝设置。你将拥有一个可卸载的软件包。

GUESS:我认为这只是为管理员和用户禁用写访问权限而不添加任何拒绝标志并确保他们仍然具有读访问权限。所以没有拒绝入场,也没有写访问标志。如果您真的希望管理员没有写访问权限,您可能还必须关闭继承权限,但我必须测试以确保。

以上是关于WiX工具集:安装具有特定权限的文件的主要内容,如果未能解决你的问题,请参考以下文章

具有提升权限的 WiX CustomAction SCHTASKS“拒绝访问”

如何在 WIX 中的包的安装条件中使用可执行文件的退出代码

Wix 工具集 - 参考二进制文件 - 单独的 wxs 文件

用于多个项目的通用 Wix 安装程序

使用 WiX 工具集部署多个 WCF Web 服务 - 错误的 svc 文件

Wix 资源收集工具“Heat”。如何获取具有动态名称的文件,例如构建时生成的 Microsoft 运行时文件