C#中对WMI查询Win32_QuickFixEngineering结果排序以获取最新Windows更新
解决方法
WMI使用的WQL查询语言本身就支持ORDER BY排序语法,你不需要额外在内存中处理,直接调整查询语句即可实现按安装日期排序取最新更新,以下是两种可行实现方案:
方案1:WQL语句直接排序(性能最优)
直接在查询语句末尾添加ORDER BY InstalledOn DESC,WMI会直接返回按安装日期降序排列的结果,取第一条就是最近安装的更新:
try { // 直接在WQL中添加降序排序逻辑 var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering ORDER BY InstalledOn DESC"); using (ManagementObjectCollection managementObjectCollection = searcher.Get()) { // 替换First为FirstOrDefault,避免无更新时抛异常 var managementObject = managementObjectCollection.OfType<ManagementObject>().FirstOrDefault(); if (managementObject == null) { systemLastWindowsUpdate = "无已安装更新"; return; } string stringDate = managementObject["InstalledOn"].ToString(); // 可添加多格式匹配,兼容不同系统的日期格式 string[] formats = { "M/d/yyyy", "yyyy-MM-dd", "MM/dd/yyyy" }; CultureInfo provider = CultureInfo.InvariantCulture; var result = DateTimeOffset.ParseExact(stringDate, formats, provider, DateTimeStyles.AssumeUniversal); systemLastWindowsUpdate = result.ToString("yyyy-MM-dd"); } } catch (Exception) { MessageBox.Show("获取Windows更新记录失败"); }
方案2:内存中LINQ排序
如果你不方便修改WQL语句,也可以把所有查询结果加载到内存后,用LINQ手动排序后取值:
try { var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering"); using (ManagementObjectCollection managementObjectCollection = searcher.Get()) { var updateList = managementObjectCollection.OfType<ManagementObject>().ToList(); if (!updateList.Any()) { systemLastWindowsUpdate = "无已安装更新"; return; } // 内存中按InstalledOn日期降序排序,取第一条 var latestUpdate = updateList.OrderByDescending(mo => { var dateStr = mo["InstalledOn"].ToString(); return DateTimeOffset.ParseExact(dateStr, new[] { "M/d/yyyy", "yyyy-MM-dd" }, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); }).First(); string stringDate = latestUpdate["InstalledOn"].ToString(); var result = DateTimeOffset.ParseExact(stringDate, new[] { "M/d/yyyy", "yyyy-MM-dd" }, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); systemLastWindowsUpdate = result.ToString("yyyy-MM-dd"); } } catch (Exception) { MessageBox.Show("获取Windows更新记录失败"); }
注意事项
- 部分旧版本系统中补丁的
InstalledOn字段格式可能存在差异,增加多格式匹配可降低解析失败概率 - 若设备从未安装过系统更新,
Win32_QuickFixEngineering会返回空结果,用FirstOrDefault提前判空可避免不必要的异常
内容的提问来源于stack exchange,提问作者TheQuestionmark
相关产品推荐
相关产品推荐

