根据操作系统语言更改安装 Wix 安装程序



我一直在使用 Wix 安装程序来创建安装程序,安装程序在安装过程中注册一个端口(使用 netsh.exe)。一切正常。 但是后来我尝试在法语的Windows 7操作系统上安装该应用程序...安装程序无法注册端口,因为 netsh 命令是为 en-US 编写的。以下命令在 en-US 计算机上工作正常:

netsh.exe http add urlacl url=http://+:6700/Demo101/user=\users,但在fr-FR OS上失败。

对于 fr-FR,我需要运行

netsh.exe http add urlacl url=http://+:6700/Demo101/user=\utilisateurs

我在Wix项目中进行了以下更改:

<?define langLocale = [OSINSTALLEDLOCALE]?>

<?if $(var.langLocale) = "00000409"?>
<!-- Firewall exception -->
<CustomAction Id="ListenerServiceAddReservation"
              Execute="deferred"
              Impersonate="no"
              Directory="INSTALLLOCATION"
              ExeCommand="[SystemFolder]netsh.exe http add urlacl url=http://+:6700/Demo101/ user=users"
              Return="asyncWait" />
<?else?>
<CustomAction Id="ListenerServiceAddReservation"
          Execute="deferred"
          Impersonate="no"
          Directory="INSTALLLOCATION"
          ExeCommand="[SystemFolder]netsh.exe http add urlacl url= http://+:6700/Demo101/ user=utilisateurs"
          Return="asyncWait" />
<?endif?>

但这不起作用,因为它没有获得值"00000409"并且总是转到 else 条件,该条件适用于法语,机器位于 en-US 中。

请帮忙吗?

使用本地化的Wix属性(自定义操作)解析正确的名称,请参阅文档:http://wixtoolset.org/documentation/manual/v3/customactions/osinfo.html(网站现在已关闭,所以我无法确认正确的链接)或谷歌WixQueryOsWellKnownSID

在您的示例中,我假设您指的是"用户"组,因此要使其正常工作,请添加一个 PropertyRef

<PropertyRef Id="WIX_ACCOUNT_USERS"/>

然后在自定义操作中使用 [WIX_ACCOUNT_USERS] 属性,该属性将解析为内置 Windows 用户和组的正确组名称。

<CustomAction Id="ListenerServiceAddReservation"
              Execute="deferred"
              Impersonate="no"
              Directory="INSTALLLOCATION"
              ExeCommand="[SystemFolder]netsh.exe http add urlacl url=http://+:6700/Demo101/ user=[WIX_ACCOUNT_USERS]"
              Return="asyncWait" />

这样,您无需为不同的区域设置使用不同的自定义操作。

<?if?><?else?> 语句是预处理器的东西,它们在编译时解析。 那行不通。 此处的关键是内置用户和组的 SID 是恒定的,因此需要使用 S-1-5-32-545。

在 WiX v3.10/v4.0 及更高版本中,您可以使用 WixHttpExtension:

<http:UrlReservation Url="http://+:6700/Demo101/">
    <http:UrlAce SecurityPrincipal="*S-1-5-32-545" Rights="register" />
</http:UrlReservation>

使用 netsh:

netsh.exe http add urlacl url= http://+:6700/Demo101/ sddl= "O:BAG:BAD:(A;;GX;;;S-1-5-32-545)"

感谢IlirB

问题已解决。 脚本中的更改很小:

而不是用户=\[WIX_ACCOUNT_USERS],它应该是用户=[WIX_ACCOUNT_USERS]

最新更新