使用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属性中,所以我也这样做,但无济于事。
在任何情况下,我都尝试了我能想到的一切,并且在安装后尝试打开文件时得到的唯一结果是:
这令人鼓舞,因为这意味着我成功地实际改变了许可,但令人沮丧,因为这不是我想要的改变。
有没有人在WiX-land中知道是否可以安装一个文件,以便用户可以读取文件而不是写入文件?
你可以直接跳到下面的技术答案,但我首先想谈谈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?
鉴于此,我只想提出一些问题(当我对你的情况有更好的理解时会尝试跟进):
总而言之,安装到自然写保护的位置,删除配置文件并从数据库读取(在网络启动时您可以完全控制并立即部署到所有人),模糊文件的内容或制作它二进制,消除文件并在源代码中进行硬编码设置。这可能对你的情况都很生气 - 我知道这一点,但请仔细检查选项。选择你可以处理的复杂性,而不是太多的未知和风险特征?
现在针对实际的技术问题。您能否向我们展示属性屏幕,其中包含相关文件的ACL信息? Right click file => Properties => Security
。它说什么?这是一个示例对话框,用挪威语,但你得到的图片。我们需要详细了解此对话框显示的内容。特别是我们需要知道是否有任何拒绝条目(下面最右边的列 - 挪威语中的“Avslå”意思是“拒绝”):
我会玩这个对话框并更改设置,直到它表现得像你期望的那样。首先删除所有拒绝权限,然后确定继承权限如何影响文件或对象的实际安全状态。使用右键单击并“运行方式...”在您需要的测试上下文中运行Notepad.exe或其他一些文本查看器 - 另一个用户(您似乎已经在做)。
“高级”按钮将转到一个对话框,您可以在其中混淆ACL的“继承”设置。换句话说,如果父对象的ACL适用于您选择要查看的对象。
在任何情况下,您都不得对LOCALSYSTEM或SYSTEM或任何帐户调用任何拒绝设置。你将拥有一个可卸载的软件包。
GUESS:我认为这只是为管理员和用户禁用写访问权限而不添加任何拒绝标志并确保他们仍然具有读访问权限。所以没有拒绝入场,也没有写访问标志。如果您真的希望管理员没有写访问权限,您可能还必须关闭继承权限,但我必须测试以确保。