Permissions 在WIX安装程序安装期间无法删除部署的文件

Permissions 在WIX安装程序安装期间无法删除部署的文件,permissions,installation,wix,custom-action,Permissions,Installation,Wix,Custom Action,在我们的WIX安装程序项目中,我们需要根据一个已部署的文件生成一个新文件,我们称之为FileB,在托管自定义操作函数中称为FileA。换句话说,在组件声明中,我声明了FileA。在自定义操作(发生在提交阶段)中,我需要基于FileA生成FileB。之后,由于FileA不再使用,我想在相同的自定义操作中删除它 问题来了:对于默认安装文件夹,即程序文件,普通用户不允许在自定义操作中将文件(生成文件B)添加到此文件夹中(我不是100%确定我是对的,但在我的测试中就是这样。如果我将其安装到另一个文件夹中

在我们的WIX安装程序项目中,我们需要根据一个已部署的文件生成一个新文件,我们称之为FileB,在托管自定义操作函数中称为FileA。换句话说,在组件声明中,我声明了FileA。在自定义操作(发生在提交阶段)中,我需要基于FileA生成FileB。之后,由于FileA不再使用,我想在相同的自定义操作中删除它

问题来了:对于默认安装文件夹,即程序文件,普通用户不允许在自定义操作中将文件(生成文件B)添加到此文件夹中(我不是100%确定我是对的,但在我的测试中就是这样。如果我将其安装到另一个文件夹中,则根本没有问题)。所以我想我需要授予创建文件的权限。为此,我向包含FileA的组件添加了一个CreateFolder元素。整个组件声明如下所示:

<Component Id='COMPONENT_NAME' Guid='MY_GUID'>
    <!--OTHER FILES IN THE COMPONENT-->
    ...
    <CreateFolder Directory='INSTALLDIR'>
      <Permission CreateFile='yes' User='Everyone' GenericAll='yes' Delete='yes'/>
    </CreateFolder>
    <File Id='MyFileA' Name='FileA'   Source='PATH_TO_FILEA' KeyPath='no' >
      <Permission GenericAll='yes' User='Everyone' Delete='yes'/>
    </File>
  </Component>

...
该组件实际上属于一个组件组,它位于INSTALLDIR中。在同一个组件元素中存在其他文件的原因是,我希望另一个文件成为密钥路径,这样删除FileA就不会引起这样的问题。现在,FileB的生成工作正常。但在同一个自定义操作中,我在删除文件时遇到了问题。它只是说:“:对路径“DEPLOYMENT\u path\u to\u FILEA”的访问被拒绝。”我认为问题在于FILEA声明,这就是为什么我在文件下的Permission元素中添加Delete='yes',希望可以删除它(尽管我不确定这是否意味着在安装中可以删除)。但我还是犯了这个错误。谁能告诉我我做错了什么

另一个问题是,我真的不知道这些CreateFolder元素的用途是什么。首先:如果目标是创建目录结构,我认为(嵌套的)目录元素已经做到了这一点。在大多数情况下,您可能希望目录结构与组件结构分离(组件只使用目录引用来引用正确的目录),为什么要在组件元素下包含这样的元素呢。其次,CreateFolder的默认目录属性是组件所在的父目录。但通常有多个组件位于同一目录中,就像我在这里看到的:多个组件位于同一个组件组中,其目录元素引用INSTALLDIR。因此,这些组件中只有一个具有CreateFolder元素,在我的例子中,其目录属性是所有这些组件的父目录。这种结构真的很难理解。我想我对CreateFolder元素有些误解。有人能告诉我CreateFolder的用法吗?谢谢


谢谢

这里有许多问题需要解决。首先,您应该知道,如果禁用回滚,则不会执行提交阶段的自定义操作。您确实应该有一个延迟和回滚自定义操作

其次,你不能让MSI先安装一个文件,然后再删除它。这会适得其反,只会导致服务问题。更好的解决方案(我假设您使用的是WiX DTF管理的自定义操作)是将FileA作为内容项包含在自定义操作项目中。这将导致文件在执行时存在于自定义操作的当前(临时)目录中。然后可以生成fileb。对于回滚,您可以删除文件B

您还需要编写RemoveFile元素,以教会MSI在卸载时删除该文件。否则它将不会,因为MSI不知道任何关于由进程外自定义操作创建的文件B的信息


否则,了解fileb的内容将非常有用。如果这是一个xml文件,可以作为fileb安装,然后使用xml wix扩展名进行转换,那么实现起来就更容易了。

这里需要解决一些问题。首先,您应该知道,如果禁用回滚,则不会执行提交阶段的自定义操作。您确实应该有一个延迟和回滚自定义操作

其次,你不能让MSI先安装一个文件,然后再删除它。这会适得其反,只会导致服务问题。更好的解决方案(我假设您使用的是WiX DTF管理的自定义操作)是将FileA作为内容项包含在自定义操作项目中。这将导致文件在执行时存在于自定义操作的当前(临时)目录中。然后可以生成fileb。对于回滚,您可以删除文件B

您还需要编写RemoveFile元素,以教会MSI在卸载时删除该文件。否则它将不会,因为MSI不知道任何关于由进程外自定义操作创建的文件B的信息


否则,了解fileb的内容将非常有用。如果这是一个xml文件,可以作为fileb安装,然后使用xml wix扩展名进行转换,那么实现起来就更容易了。

谢谢Christopher,它们是非常有用的建议。我将修改我的WIX项目。该例程是从我们现有的Windows Installer项目复制的。但我也明白你的意思,在安装中删除一个已部署的文件。顺便说一句,FileA是mdb文件,FileB是mde文件有什么原因不能在构建过程中将mdb转换为mde,然后只部署mde文件?我在这里没有经验,所以我不知道你可能要解决的问题。老实说,我也没有这方面的经验,尽管我问了自己同样的问题。因为这就是我们当前的Windows Installer项目的工作方式,而我正是创建另一个部署项目的人:)我不熟悉Access编程。我会深入研究并找出答案。熟悉各种技术