Wix 安装程序中的文件夹(在安装期间创建)对所有用户不可见

Posted

技术标签:

【中文标题】Wix 安装程序中的文件夹(在安装期间创建)对所有用户不可见【英文标题】:Folder (Created during installation ) in Wix Installer not visible for all Users 【发布时间】:2015-05-29 06:59:57 【问题描述】:

我使用 wix 开发了一个设置,它非常适合管理员登录。但我希望我的应用程序适用于所有用户,包括管理员。所以我在包中设置了 InstallScope="perMachine"元素。但是为了维护一些日志、帮助文档等,我在 %appdata%\ApplicinName 中创建了一个文件夹,并在我的应用程序运行时保存一个日志文件,但最初会创建该文件夹在安装设置期间,它在管理员登录中完美运行,但如果我登录到用户帐户,则在用户帐户中,文件夹不是在 %appdata% 路径中创建的。

我在appdata中的文件夹(XXX)只对管理员可见,对其他用户不可见。如何在安装过程中使同一文件夹对包括管理员在内的所有用户可见。

在文件夹中,我的应用程序中有一些模板,例如一些模板将与安装程序一起添加,称为预定义模板。这些预定义模板应该对所有用户可见。除此之外,用户也可以创建将保存在同一文件夹下的模板,但用户应该只能看到预定义的模板和该用户自己创建的模板。 (ie) 他应该看不到其他用户创建的模板 问候 阿尔沙德

【问题讨论】:

如果您想写入所有用户的公共文件夹,请尝试写入 C:\ programName 而不是 appdata。这可能是权限问题。 @user3165438 我的要求是我的应用程序中有模板,例如一些模板将与安装程序一起添加,称为预定义模板。这些预定义模板应该对所有用户可见。除此之外,用户也可以创建将保存在同一文件夹下的模板,但用户应该只能看到预定义的模板和该用户自己创建的模板。 (ie) 他应该看不到其他用户创建的模板 感谢您提供详细信息。我了解您希望为每个用户存储模板。安装时,仅为从其帐户安装程序的用户创建该文件夹。看看这里:itninja.com/question/… @user3165438 但至少最初预定义的模板应该对 appdata 文件夹中的所有用户可见,不知道如何做到这一点:( :)( 这样,我希望您使用CommonAppDataFolder 而不是[AppDataFolder]:[AppDataFolder] = 属性为当前用户的漫游文件夹的完整路径。 [CommonAppDataFolder] = 包含所有用户的应用程序数据的文件目录的完整路径 【参考方案1】:

我进行了测试,发现这个 WIX 片段成功地在安装用户的用户配置文件中创建了一个文件夹,该文件夹具有允许其他用户访问该文件夹及其内容的安全设置:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="AppDataFolder" Name="AppDataFolder">
    <Directory Id="MyDataRoot" Name="XXX">
      <Component Id="MyDataRoot" Guid="--MY GUID--">
        <RegistryValue Root="HKCU" Key="Software\Company\Product\SpecialFolder" Name="Installed" Type="string" Value="yes" KeyPath="yes"/>
        <RemoveFolder Id="MyDataRoot" Directory="MyDataRoot" On="uninstall"/>
        <CreateFolder Directory="MyDataRoot">
          <util:PermissionEx GenericAll="yes" User="Users"/>
        </CreateFolder>
      </Component>
    </Directory>
  </Directory>
</Directory>

注意事项:

    上述片段为安装用户创建了一个用户配置文件文件夹,其他用户可以访问该文件夹。请参阅下面有关此方法的安全影响的评论。 实际 GUID 已替换为“--MY GUID--”。 &lt;RegistryValue...&gt; 是解决错误 ICE38 所必需的:组件 MyDataRoot 安装到用户配置文件。它必须使用 HKCU 下的注册表项作为其 KeyPath,而不是文件。 &lt;RemoveFolder...&gt; 是解决错误 ICE64 所必需的:目录 MyDataRoot 位于用户配置文件中,但未列在 RemoveFile 表中。 我使用 WIX V3.9 构建了安装包。 安装程序包已通过在 Windows 8.1 64 位上安装进行测试。

但是,从安全角度来看,在一个用户配置文件中创建一个可供其他用户访问的目录是有问题的。您是否考虑过更改您的应用程序以在应用程序启动时创建用户配置文件文件夹,而不是使用安装程序来创建用户配置文件文件夹?

例如,您的应用程序可以使用System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 来获取当前用户的应用程序数据文件夹,并在此文件夹中创建一个子文件夹来存储您的应用程序的日志。这种方法可确保来自您的应用程序的日志转到当前用户的应用程序文件夹,而不是其他用户的应用程序文件夹。

【讨论】:

@bradfordg 感谢您的回复。我会检查一下并让您知道..!! 我尝试了相同的方法,并且仅为管理员创建了文件夹。对于其他用户,没有创建文件夹。注意:我没有添加该注册表行(我认为没有必要) 在安装程序中创建用户配置文件文件夹,只会为安装用户(在本例中为管理员)创建一个文件夹。安装不会为任何其他用户创建文件夹。如果您希望您的应用程序日志转到用户特定的文件夹,您的应用程序应该创建所需的文件夹而不是安装程序。 真的非常感谢..!!但我希望我的安装程序在 appdata 中创建一个文件夹,该文件夹应该对包括管理员在内的所有用户可见。如何在 wix 中执行此操作..? 更详细地更新了我的答案(包括对注册表行背后原因的解释)。您能否在问题中提供更多信息:a)您使用的是哪个版本的 WIX? b) 目标操作系统是什么? c) 创建的文件夹的安全性是什么?

以上是关于Wix 安装程序中的文件夹(在安装期间创建)对所有用户不可见的主要内容,如果未能解决你的问题,请参考以下文章

Wix安装程序:解压缩用户在安装期间选择的存档

Wix - 如何创建一个临时文件以在安装期间使用

如何在卸载时立即生成WIX执行命令

Wix 在安装文件期间检查 netfreamwork 4

在卸载期间提示用户关闭应用程序(在 WiX 中)

WiX:如何在升级期间显示 EULA 协议 UI?