为什么不能通过 GPO 安装多语言 MSI?
Why doesn't installation of multi-language MSI work via GPO?
我在尝试测试 GPO 部署时遇到了多语言 MSI 部署失败的问题。我有一个多语言 Wix 项目并制作了 2 个 MSI(英语和多语言)。我有两个远程虚拟机,其中一个充当服务器 (Windows Server 2012 R2),它将 GPO 策略推送到另一个充当客户端虚拟机 (Windows 10)。
这里有一些线索:
- MSI 包在用户配置 > 策略 > 软件设置下设置
- 通过 GPO,我可以安装英文版本,但不能安装多语言版本。
- 我能够通过手动安装来安装两者。
- 我只能通过重新安装来安装多语言版本(手动安装多语言版本,然后通过 GPO 重新安装,而无需先卸载)
- 在 MSI 日志中(Setup manually via registry,值为
voicewarmupx
)前 21 行对于通过 GPO 安装两个 MSI 是相似的。 (查看下面的附录)
- 在多国语言的MSI日志中,第22行,有一行显示
MainEngineThread is returning 1605
(见附录)。 error code 表示该程序正在尝试对当前未安装的内容执行操作,但我不确定该怎么做。
- 此 WIX 项目包含自定义操作,因此我设置了一段代码以尽早记录会话(在
InstallUISequence
节点下的 FindRelatedProducts
之前创建一个自定义操作)但它没有' 出现在日志中,所以这可能意味着错误发生得更早。
出了什么问题?
附录
这些是我在用户配置 > 策略 > 软件设置下为服务器中的两个 MSI 设置的 GPO 设置。
这是成功的日志(英文)
这是失败的日志(多国语言)
免责声明:我没有设置来测试这是否有效,但请试试这个:
当您点击“高级...”按钮时,请尝试select“部署此包时忽略语言”select =36=] 选项 (source):
链接:
- Previously attempted answer - 交叉引用。
- GPO Deployments of Multiple Language installer
- Deploying .msi application through GPO doesn't work
2021 年 6 月 23 日更新
我将问题转发到 Wix github 页面,有人能够帮助找出根本原因。您可以查看他们的 reply here.
You advertised the product {4AC8B148-A051-4CC4-86D4-8D2079A8CF54}
and then tried to perform a transaction (I assume to transition it from advertised to installed) on the product {e4bedd32-4df6-475e-aef5-b12a58497a1c}
(which doesn't exist on the system).
Basically, when advertising an MSI, any embedded transforms would appear to be ignored for purposes of the identification of the product(s) contained in the MSI file. Yet, when installing, embedded "language transforms" are automatically applied.
If you had installed the MSIs directly, without first advertising them, that may have worked.
解决方案是 或者 简单地使用一组 productID 而不是星号 (*) OR 同步所有多个产品的 productID生成多语言 MSI 后,使用主安装程序的产品 ID 的语言 MSI。
就个人而言,我选择了第二个选项,我使用 wirunsql + 批处理脚本,如下所示:
REM Get the product ID from the installer that you want to make into a multi-language installer
FOR /F %%a IN ('C:\Windows\System32\cscript.exe .\wirunsql.vbs %RELEASEDIR%\en-US\installer.msi "SELECT Value From Property WHERE Property = 'ProductCode'"') DO ( SET ENUSGUID=%%a&& echo ENUSGUID )
REM Use wrunsql.exe to update the product ID of German language installer
C:\Windows\System32\cscript.exe .\wirunsql.vbs %RELEASEDIR%\de-DE\installer.msi "UPDATE Property SET Value='%ENUSGUID%' WHERE Property='ProductCode'"
...
REM repeat for other installers in other languages
...
REM finally extract the transform files from each installer and inject into the main installer
旧答案
显然,仅当部署的 MSI 使用中性语言 (LCID = 0) 或英语进行安装时,GPO 部署才有效。否则,GPO 将选择 LCID 列表中最低的语言代码 ID (LCID) 作为安装的默认语言。如果所选 LCID 的语言包在目标 OS 中不存在,部署将失败。不过,我不确定这与错误代码 1605 有什么关系。
我不确定如何在 Wix 工具集中执行此操作,但绝对可以在 Orca 等 MSI 编辑器中完成。只需转到“查看”>“摘要信息”并将 0 添加到“语言”字段中的 LCID 列表,如下所示。
警告
显然,在 MSI 中设置中性语言似乎会使 Windows 安装程序在手动 运行 时以英语启动。它不遵循 OS.
的区域格式
来源:https://www.advancedinstaller.com/forums/viewtopic.php?f=2&t=29094&p=76677#p76677
我在尝试测试 GPO 部署时遇到了多语言 MSI 部署失败的问题。我有一个多语言 Wix 项目并制作了 2 个 MSI(英语和多语言)。我有两个远程虚拟机,其中一个充当服务器 (Windows Server 2012 R2),它将 GPO 策略推送到另一个充当客户端虚拟机 (Windows 10)。
这里有一些线索:
- MSI 包在用户配置 > 策略 > 软件设置下设置
- 通过 GPO,我可以安装英文版本,但不能安装多语言版本。
- 我能够通过手动安装来安装两者。
- 我只能通过重新安装来安装多语言版本(手动安装多语言版本,然后通过 GPO 重新安装,而无需先卸载)
- 在 MSI 日志中(Setup manually via registry,值为
voicewarmupx
)前 21 行对于通过 GPO 安装两个 MSI 是相似的。 (查看下面的附录) - 在多国语言的MSI日志中,第22行,有一行显示
MainEngineThread is returning 1605
(见附录)。 error code 表示该程序正在尝试对当前未安装的内容执行操作,但我不确定该怎么做。 - 此 WIX 项目包含自定义操作,因此我设置了一段代码以尽早记录会话(在
InstallUISequence
节点下的FindRelatedProducts
之前创建一个自定义操作)但它没有' 出现在日志中,所以这可能意味着错误发生得更早。
出了什么问题?
附录
这些是我在用户配置 > 策略 > 软件设置下为服务器中的两个 MSI 设置的 GPO 设置。
这是成功的日志(英文)
这是失败的日志(多国语言)
免责声明:我没有设置来测试这是否有效,但请试试这个:
当您点击“高级...”按钮时,请尝试select“部署此包时忽略语言”select =36=] 选项 (source):
链接:
- Previously attempted answer - 交叉引用。
- GPO Deployments of Multiple Language installer
- Deploying .msi application through GPO doesn't work
2021 年 6 月 23 日更新
我将问题转发到 Wix github 页面,有人能够帮助找出根本原因。您可以查看他们的 reply here.
You advertised the product
{4AC8B148-A051-4CC4-86D4-8D2079A8CF54}
and then tried to perform a transaction (I assume to transition it from advertised to installed) on the product{e4bedd32-4df6-475e-aef5-b12a58497a1c}
(which doesn't exist on the system).Basically, when advertising an MSI, any embedded transforms would appear to be ignored for purposes of the identification of the product(s) contained in the MSI file. Yet, when installing, embedded "language transforms" are automatically applied.
If you had installed the MSIs directly, without first advertising them, that may have worked.
解决方案是 或者 简单地使用一组 productID 而不是星号 (*) OR 同步所有多个产品的 productID生成多语言 MSI 后,使用主安装程序的产品 ID 的语言 MSI。
就个人而言,我选择了第二个选项,我使用 wirunsql + 批处理脚本,如下所示:
REM Get the product ID from the installer that you want to make into a multi-language installer
FOR /F %%a IN ('C:\Windows\System32\cscript.exe .\wirunsql.vbs %RELEASEDIR%\en-US\installer.msi "SELECT Value From Property WHERE Property = 'ProductCode'"') DO ( SET ENUSGUID=%%a&& echo ENUSGUID )
REM Use wrunsql.exe to update the product ID of German language installer
C:\Windows\System32\cscript.exe .\wirunsql.vbs %RELEASEDIR%\de-DE\installer.msi "UPDATE Property SET Value='%ENUSGUID%' WHERE Property='ProductCode'"
...
REM repeat for other installers in other languages
...
REM finally extract the transform files from each installer and inject into the main installer
旧答案
显然,仅当部署的 MSI 使用中性语言 (LCID = 0) 或英语进行安装时,GPO 部署才有效。否则,GPO 将选择 LCID 列表中最低的语言代码 ID (LCID) 作为安装的默认语言。如果所选 LCID 的语言包在目标 OS 中不存在,部署将失败。不过,我不确定这与错误代码 1605 有什么关系。
我不确定如何在 Wix 工具集中执行此操作,但绝对可以在 Orca 等 MSI 编辑器中完成。只需转到“查看”>“摘要信息”并将 0 添加到“语言”字段中的 LCID 列表,如下所示。
警告
显然,在 MSI 中设置中性语言似乎会使 Windows 安装程序在手动 运行 时以英语启动。它不遵循 OS.
的区域格式来源:https://www.advancedinstaller.com/forums/viewtopic.php?f=2&t=29094&p=76677#p76677