Windows 7 如何使WIX在安装中创建文件到程序文件文件夹?我有“权限定义”

Windows 7 如何使WIX在安装中创建文件到程序文件文件夹?我有“权限定义”,windows-7,installation,wix,access-denied,Windows 7,Installation,Wix,Access Denied,我正在创建一个WIX安装程序项目。在一个托管自定义操作期间,我需要创建一个文件,而不是安装文件夹中WIX组件中指定的已部署文件,默认情况下是Program files文件夹。我在Windows 7中遇到访问被拒绝的问题。经过一番搜索,我发现有人说不建议在ProgramFiles文件夹中创建文件。相反,尝试将文件创建到例如AppData文件夹中。例如,请参见以下链接: 但我的问题是,生成的文件对我们的软件至关重要,因此它必须位于安装文件夹中。它不是软件安装的目标吗,我的意思是,在大多数情况下在P

我正在创建一个WIX安装程序项目。在一个托管自定义操作期间,我需要创建一个文件,而不是安装文件夹中WIX组件中指定的已部署文件,默认情况下是Program files文件夹。我在Windows 7中遇到访问被拒绝的问题。经过一番搜索,我发现有人说不建议在ProgramFiles文件夹中创建文件。相反,尝试将文件创建到例如AppData文件夹中。例如,请参见以下链接:

但我的问题是,生成的文件对我们的软件至关重要,因此它必须位于安装文件夹中。它不是软件安装的目标吗,我的意思是,在大多数情况下在ProgramFiles文件夹中创建文件?这是否意味着只需将文件添加到安装文件夹中,在安装过程中,部署的文件基本上是XCopy的目标

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

更新:


基于MichaelUrman的一个Commo,更多信息。软件安装后需要生成的文件,并且在软件正常启动期间需要生成该文件。我认为安装后正常使用时需要修改。正如我在@caveman_dick answer中提到的,我的CA实际上处于提交阶段,我不知道它与普通的延迟CA是否有任何区别,将运行提升的命令,并应授予其创建文件所需的权限。

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

因为您需要从主应用程序更新该文件,我假设您的应用程序不需要提升权限,您有三种选择

第一个是最糟糕的:如果没有清单,可执行文件尝试写入Program Files文件夹通常会导致它重定向到虚拟存储。听起来你的情况没有发生这种情况,所以你不能使用它。 第二个选项是修改应用程序以将其存储在适当的位置,例如ProgramData文件夹或公共文档,或者如果适当,在LocalAppData下存储每个用户的位置。这通常是最好的方法,但开发成本最高。 最后,第三个选项是创建文件并更改其权限,或者在某些情况下更改对包含文件的文件夹的权限,从而允许有限的用户修改此文件。请参阅LockPermissions或MsiLockPermissionsEx,了解Windows安装程序实现此目的的方法。如果使用此选项,请更改对尽可能少的文件或文件夹的权限,使系统尽可能安全。
由于您需要从主应用程序更新该文件,并且我假设您的应用程序不需要提升权限,因此您有三个选项

第一个是最糟糕的:如果没有清单,可执行文件尝试写入Program Files文件夹通常会导致它重定向到虚拟存储。听起来你的情况没有发生这种情况,所以你不能使用它。 第二个选项是修改应用程序以将其存储在适当的位置,例如ProgramData文件夹或公共文档,或者如果适当,在LocalAppData下存储每个用户的位置。这通常是最好的方法,但开发成本最高。 最后,第三个选项是创建文件并更改其权限,或者在某些情况下更改对包含文件的文件夹的权限,从而允许有限的用户修改此文件。请参阅LockPermissions或MsiLockPermissionsEx,了解Windows安装程序实现此目的的方法。如果使用此选项,请更改对尽可能少的文件或文件夹的权限,使系统尽可能安全。
请澄清何时需要创建和/或修改此文件。如果它只需要由安装创建或修改,则有一个答案;如果安装后它必须在任意时间进行编辑,则有另一个答案。@MichaelUrman感谢您的评论。请参阅我的更新请澄清何时需要创建和/或修改此文件。如果它只需要由安装创建或修改,则有一个答案;如果安装后它必须在任意时间进行编辑,则有另一个答案。@MichaelUrman感谢您的评论。请看我的最新消息
我们的答案。我还有两个问题:1我是否还应该指定Impersonate='no'?因为我发现默认情况下,它被设置为“是”,据我所知,这意味着它将使用登录用户的权限,并且通常没有权限修改Program files文件夹中的文件。2如果我的CA处于提交阶段,我的Execute='commit'?是要对程序文件目录进行任何更改,您也必须将其标记为Impersonate='no'。如果将其设置为“模拟”,您将遇到权限问题,就像您遇到的问题一样。谢谢您的回答。我还有两个问题:1我是否还应该指定Impersonate='no'?因为我发现默认情况下,它被设置为“是”,据我所知,这意味着它将使用登录用户的权限,并且通常没有权限修改Program files文件夹中的文件。2如果我的CA处于提交阶段,我的Execute='commit'?是要对程序文件目录进行任何更改,您也必须将其标记为Impersonate='no'。如果设置为“模拟”,您将遇到权限问题,就像您遇到的问题一样。谢谢Michael,这真是鼓舞人心。我想我会选择第三种选择。目前,我正在使用提升的权限为我的自定义操作创建文件,它工作正常,但带来了一个小问题,我们正在寻找替代方案,以不运行CA作为系统帐户。假设我生成的文件应该在INSTALLDIR下,我尝试使用WIX中的permission元素授予登录用户对此目录的写入权限,但在没有提升权限的情况下运行CA时,我仍然获得了权限。有什么想法吗?谢谢迈克尔,这真的很鼓舞人心。我想我会选择第三种选择。目前,我正在使用提升的权限为我的自定义操作创建文件,它工作正常,但带来了一个小问题,我们正在寻找替代方案,以不运行CA作为系统帐户。假设我生成的文件应该在INSTALLDIR下,我尝试使用WIX中的permission元素授予登录用户对此目录的写入权限,但在没有提升权限的情况下运行CA时,我仍然获得了权限。有什么想法吗?