如何在Wix安装程序中获取系统BIOS版本以校验前置条件?
在Wix中获取系统BIOS版本并实现前置条件检查
Wix本身没有内置的BIOS版本属性,需要通过**自定义动作(Custom Action)**读取WMI(Windows Management Instrumentation)中的BIOS信息来实现,具体步骤如下:
1. 编写C#自定义动作读取BIOS版本
创建一个C#类库项目,引用Microsoft.Deployment.WindowsInstaller(可通过NuGet安装WiX Toolset Custom Action包),实现读取BIOS版本的方法:
using Microsoft.Deployment.WindowsInstaller; using System.Management; namespace BiosCheckCustomAction { public class CustomActions { [CustomAction] public static ActionResult GetBiosVersion(Session session) { session.Log("Starting BIOS version retrieval"); try { var searcher = new ManagementObjectSearcher("SELECT SMBIOSBIOSVersion FROM Win32_BIOS"); foreach (ManagementObject obj in searcher.Get()) { session["BIOS_VERSION"] = obj["SMBIOSBIOSVersion"]?.ToString() ?? string.Empty; session.Log($"Retrieved BIOS version: {session["BIOS_VERSION"]}"); break; } return ActionResult.Success; } catch (Exception ex) { session.Log($"Error retrieving BIOS version: {ex.Message}"); return ActionResult.Failure; } } } }
编译生成DLL文件备用。
2. 在Wix项目中注册自定义动作
在你的Wix安装包项目里,添加自定义动作的二进制引用,并定义执行逻辑:
<!-- 引入自定义动作DLL --> <Binary Id="BiosCheckCA" SourceFile="..\BiosCheckCustomAction\bin\Release\BiosCheckCustomAction.dll" /> <!-- 定义自定义动作 --> <CustomAction Id="GetBiosVersion" BinaryKey="BiosCheckCA" DllEntry="GetBiosVersion" Execute="immediate" Return="check" /> <!-- 安排自定义动作在前置条件检查前执行 --> <InstallUISequence> <Custom Action="GetBiosVersion" Before="LaunchConditions" /> </InstallUISequence> <InstallExecuteSequence> <Custom Action="GetBiosVersion" Before="LaunchConditions" /> </InstallExecuteSequence>
3. 配置BIOS版本前置条件及后续检查
现在可以通过自定义动作生成的BIOS_VERSION属性,设置前置条件,并控制后续检查的执行顺序:
<!-- 先检查BIOS版本,不符合则终止后续检查 --> <Condition Id="BIOSCheck" Message="BIOS版本必须至少为1.2.3才能继续安装,请更新BIOS后重试。"> BIOS_VERSION >= "1.2.3" OR NOT Installed </Condition> <!-- 仅当BIOS版本符合要求时,才检查其他前置条件 --> <Condition Message=".NET Framework 4.8未安装。" After="BIOSCheck"> BIOS_VERSION >= "1.2.3" AND NETFRAMEWORK48 </Condition> <Condition Message="系统磁盘空间不足。" After="BIOSCheck"> BIOS_VERSION >= "1.2.3" AND (FreeSpace >= 10485760) </Condition>
注意事项
- 不同厂商的BIOS版本格式可能存在差异(如数字版、字母数字混合版),若版本格式非标准语义化版本,需在自定义动作中添加自定义版本比较逻辑,再将结果存入Wix属性供条件判断使用。
- 读取Win32_BIOS无需额外权限,但安装程序本身通常需要管理员权限,确保自定义动作能正常执行。
内容的提问来源于stack exchange,提问作者Sachin Deoli
相关产品推荐
相关产品推荐

