如何在 wix .wxs 文件中指定 <SecureCustomProperties Property="PROP1;PROP2"/>

How to specify <SecureCustomProperties Property="PROP1;PROP2"/> in wix .wxs file

我想在 Wix 安装程序的 wix .wxs 文件中将 属性 指定为受限 属性。

  <Property Id="PROP1">
     <RegistrySearch Id="Prop1"
                     Root="HKLM"
                     Key="SYSTEM\CurrentControlSet\Services\mysvc"
                     Name="installers"
                     Type="raw" />
  </Property>
  <Property Id="PROP2">
     <RegistrySearch Id="Prop2"
                     Root="HKLM"
                     Key="SYSTEM\CurrentControlSet\Services\mysvc"
                     Name="DisplayName"
                     Type="raw" />
  </Property>

有什么想法吗?

想要 PROP1PROP2 私有/安全。

尝试将它们设为小写,但 RegistrySearch 不接受:

error CNDL0012 : The Property/@Id attribute's value, 'Prop1', cannot contain lowercase characters.

因为这是一个搜索 属性,它也必须是一个 public 属性。这意味着 属性/@Id 值必须完全大写。

我认为您需要为 属性 元素设置属性 Secure="yes",以便将有问题的 属性 添加到您的 SecureCustomProperties 列表中已编译的 MSI 文件。

样本:

<Property Id="MYPROPERTY1" Secure="yes" Value="SomeValue" /> 
<Property Id="MYPROPERTY2" Secure="yes" Value="SomeOtherValue" /> 

编译后的 MSI 中的结果 SecureCustomProperties 值(还有两个 auto-generated 属性):MYPROPERTY1;MYPROPERTY2;WIX_DOWNGRADE_DETECTED;WIX_UPGRADE_DETECTED

您的案例:

所以在你的情况下类似于下面(我将 属性 值设置为 0 以防注册表搜索找不到任何东西 - 然后我有一个默认值):

<Property Id="PROP1" Secure="yes" Value="0" >
   <RegistrySearch Id="Prop1"
                   Root="HKLM"
                   Key="SYSTEM\CurrentControlSet\Services\mysvc"
                   Name="installers"
                   Type="raw" />
</Property>

SecureCustomProperties 列出了所有可以发送到延迟模式的属性 - 当安装用户不是管理员,而是使用提升权限安装的标准用户时,延迟模式运行提升。有关此问题的良好技术概述,请查看:Restricted Public Properties.


题外话:

现在,强制性题外话:前段时间有一个案例,当时我出于某种原因需要能够自己覆盖 SecureCustomProperties 的值 -而不是根据所有设置了 Secure="yes" 标志的属性 auto-generated。

对于我的生活,我现在不记得需要背后的推理细节。也许 Chris 或 Phil 会记得/知道类似的案例。我认为这与 WiX 添加 auto-magically 到我的 MSI 的属性有关,但它们没有设置安全,我需要确保它们安全,以便在延迟模式下可靠地访问它们的值。我不记得它与什么 WiX 功能有关。