【问题标题】:How to make WIX create files to Program Files folder in the installation? I have "Access defined"如何让 WIX 在安装中创建文件到 Program Files 文件夹?我有“访问定义”
【发布时间】:2012-07-10 20:01:12
【问题描述】:

我正在创建一个 WIX 安装程序项目。在一个托管的自定义操作期间,我需要在安装文件夹中创建一个文件(除了 WIX 组件中指定的部署文件),默认情况下是 Program Files 文件夹。我在 Windows 7 中遇到“拒绝访问”问题。经过一番搜索,我发现人们说不建议在 Program Files 文件夹中创建文件。相反,尝试将文件创建到例如 AppData 文件夹中。例如,请参阅此链接: C# Access denied to path in a Windows Application

但我的问题是,生成的文件对我们的软件至关重要,所以它必须驻留在安装文件夹中。我的意思是,在大多数情况下,创建文件不是 SW 安装的目标 Program Files 文件夹吗?这是否意味着应该将唯一的文件添加到安装文件夹中,在安装过程中,部署的文件(基本上是 XCopy 的目标)?

我的文件无法在 WIX 中部署,即无法在安装前准备好。那么处理这种情况的正确方法或最佳实践是什么:必须在安装过程中生成一个文件,放入安装文件夹。这不是我可以放在其他地方的日志文件。我试图在 WIX 中为 INSTALLADIR 创建一个 Permission 元素,虽然它似乎违反了链接中提到的规则,但它仍然失败。谢谢!

更新:

基于 MichaelUrman 的一个评论,提供更多信息。生成的文件是软件安装后需要的,软件正常启动时需要的。而且我认为在安装后的正常使用过程中需要对其进行修改。正如我提到我对@caveman_dick 答案的评论,我的 CA 实际上处于提交阶段,我不知道它与普通的延迟 CA 是否有任何区别

【问题讨论】:

  • 请说明何时需要创建和/或修改此文件。如果它只需要由安装创建或修改,则有一个答案,如果它必须在安装后的任意时间进行编辑,则有另一个答案。
  • @MichaelUrman 感谢您的评论。请看我的更新

标签: windows-7 installation wix access-denied


【解决方案1】:

将自定义操作设置为Execute="deferred",这将运行提升的命令并应为其提供创建文件所需的权限。

【讨论】:

  • 感谢您的回答。我还有两个问题:1)我还应该指定 Impersonate = 'no' 吗?因为我发现默认情况下它设置为“是”,据我了解,这意味着它将使用我的登录用户的权限,并且通常无权修改 Program Files 文件夹中的文件。 2) 如果我的 CA 处于提交阶段(我的 Execute='commit')怎么办?
  • 是,要对程序文件目录进行任何更改,您也必须将其标记为 Impersonate = 'no'。如果设置为模拟,您将遇到类似的权限问题。
【解决方案2】:

由于您需要从主应用程序更新该文件,并且我假设您的应用程序不需要提升权限,因此您有三个选项。

  1. 第一个是最糟糕的:如果没有清单,您的可执行文件尝试写入 Program Files 文件夹通常会导致它被重定向到虚拟存储(请参阅File Virtualization)。听起来你的情况没有发生这种情况,所以你不能使用它。
  2. 第二个选项是修改应用程序以将其存储在适当的位置,例如 ProgramData 文件夹或 Common Documents,或(如果适用)LocalAppData 下的每个用户位置。这通常是最好的方法,但开发成本最高。
  3. 最后第三个选项是创建文件并更改其权限(或在某些情况下更改包含该文件的文件夹的权限),允许有限用户修改此文件。请参阅 LockPermissions 或 MsiLockPermissionsEx 以了解 Windows 安装程序解决此问题的方法。如果您选择此选项,请尽可能少地更改文件或文件夹的权限,以确保系统尽可能安全。

【讨论】:

  • 谢谢迈克尔,这真的很鼓舞人心。我想我会选择第三种选择。目前我正在为我的自定义操作使用提升的权限来创建文件,它工作正常但带来了一个小问题,我们正在寻找不将 CA 作为系统帐户运行的替代方法。假设我生成的文件应该在 INSTALLDIR 下,我尝试使用 WIX 中的 Permission 元素授予登录用户对此目录的写权限,但是在没有提升权限的情况下运行我的 CA 时仍然得到了。对此有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多