如何使用C#获取Windows最后一次已安装更新日期实现合规审计
C# 获取Windows系统最后一次已安装更新日期实现方案
方案说明
该方案完全对齐原有PowerShell脚本的审计逻辑,通过WUAPI接口拉取系统更新历史,筛选安装成功的记录取最新日期,判断是否满足近30天安装过更新的合规要求,不需要替换为检测待安装更新的间接逻辑。
前置配置
- 右键项目依赖项,选择添加COM引用
- 在COM列表中找到Microsoft Update Session Object Library,勾选后完成添加
- 若编译时提示互操作类型无法嵌入,选中添加后的WUApiLib引用,在属性面板将嵌入互操作类型设置为
False即可
实现代码
using System; using System.Linq; using WUApiLib; public class UpdateComplianceAudit { /// <summary> /// Windows更新合规性校验 /// </summary> /// <param name="lastInstallDisplay">最后一次成功安装更新的时间,无有效记录时返回"Never"</param> /// <returns>审计结果:true=近30天存在成功安装的更新,校验通过;false=校验失败</returns> public static bool RunAudit(out string lastInstallDisplay) { lastInstallDisplay = "Never"; DateTime? lastSuccessInstallTime = null; const int validDayRange = 30; // 创建WUAPI更新会话实例,和PowerShell调用的COM组件完全一致 Type sessionType = Type.GetTypeFromProgID("Microsoft.Update.Session"); IUpdateSession updateSession = (IUpdateSession)Activator.CreateInstance(sessionType); // 拉取最近100条更新历史,和原脚本参数保持一致 IUpdateHistoryEntryCollection historyEntries = updateSession.QueryHistory("", 0, 100); // 筛选安装结果为成功的记录,按时间倒序排序 var successRecords = historyEntries.Cast<IUpdateHistoryEntry>() .Where(entry => entry.ResultCode == OperationResultCode.orcSucceeded) .OrderByDescending(entry => entry.Date) .ToList(); if (successRecords.Count > 0) { // WUAPI返回时间为UTC标准时间,自动转换为本地时区时间(兼容夏令时,比原脚本手动算偏移更可靠) DateTime utcTime = successRecords[0].Date; lastSuccessInstallTime = utcTime.ToLocalTime(); lastInstallDisplay = lastSuccessInstallTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } // 合规判断 if (!lastSuccessInstallTime.HasValue || lastSuccessInstallTime.Value <= DateTime.Now.AddDays(-validDayRange)) { return false; } return true; } }
原有测试代码报错原因
- 接口使用错误:原测试代码调用的
IUpdateSearcher.Search()方法用途是搜索待安装的更新列表,和查询已安装更新历史的需求不匹配,无法实现原有逻辑 - 实例化方式问题:直接new
UpdateSessionClass在默认编译配置下会触发互操作类型嵌入错误,通过ProgID反射创建实例可以避开该问题,兼容性更好
部署注意事项
- 若代码运行在Windows服务场景,需要将服务运行账号设置为Local System,避免权限不足无法访问WUAPI接口
- 若设备存在长期不更新的情况,可以将
QueryHistory的第三个参数(拉取历史条数)从100调整为更大值(如1000),避免拉取的历史范围不足导致漏检 - 不建议用「检测是否存在待安装更新」作为审计判断逻辑,该逻辑无法覆盖用户长期未手动检查更新、系统未扫描到待安装补丁的场景,审计结果准确性无法保证
内容的提问来源于stack exchange,提问作者Landon George
相关产品推荐
相关产品推荐

