You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:39:21