1

我正在尝试在许多不同的机器上收集 Windows 更新的准确图片,特别是 KB 安装。我已经尝试了许多不同的代码,我发现这些代码分散在各处,但我似乎仍然无法准确地描绘出所安装的内容。准确地说,我的意思是当我使用 Windows UI 检查机器上的 Windows 更新历史记录时,我收集的任何内容似乎都是显示的内容的一个子集!似乎无法弄清楚这一点!

这是我尝试过的一些事情;

        UpdateSession uSession = new UpdateSession();

        IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher();
        uSearcher.Online = false;

        ISearchResult sResult = uSearcher.Search("IsInstalled=1");

        foreach (IUpdate update in sResult.Updates)
        {
            foreach (string kbaid in update.KBArticleIDs)
            {
                txtAllUpdates.AppendText(kbaid + Environment.NewLine);
            }
        }

我还尝试在同一例程中添加代码以收集捆绑更新字段中的所有更新,如下所示;

        foreach (IUpdate update2 in update.BundledUpdates)
        {
            txtAllUpdates.AppendText("\t--> " + update2.Title + Environment.NewLine);
            foreach (string kbaid2 in update2.BundledUpdates)
            {
                string kbNo = GetKBNo(update2.Title.ToLower());
                txtAllUpdates.AppendText("\t\t" + kbNo);
            }
        }

我还尝试查看更新历史记录,但这为我提供了另一组数据 - 仍然不完整!

        UpdateSession updateSession = new UpdateSession();
        IUpdateSearcher updateSearcher = updateSession.CreateUpdateSearcher();
        int count = updateSearcher.GetTotalHistoryCount();
        MessageBox.Show("Total Count = " + count);
        IUpdateHistoryEntryCollection history = updateSearcher.QueryHistory(0, count);

        for (int i = 0; i < count; ++i)
        {
            txtAllUpdates.AppendText("\t\t\t" + history[i].Title);

        }

我还检查了一些利用注册表的代码,但从我读过的内容来看,这不是正确的做事方式。在这一点上,我正在执行许多不同的查询,搜索“KB”引用的条目并构建一个列表并删除重复项,但我仍然没有得到我在屏幕上看到的相同列表!即使这确实有效,也可能不是正确的方法——我觉得我一定错过了一些东西。

最后,我试图获取有关上次检查和安装更新的时间的信息——即使这与显示的内容不匹配。我用下面的代码做到了这一点;

        var auc = new AutomaticUpdatesClass();

        DateTime? lastInstallationSuccessDateUtc = null;
        if (auc.Results.LastInstallationSuccessDate is DateTime)
            lastInstallationSuccessDateUtc = new DateTime(((DateTime)auc.Results.LastInstallationSuccessDate).Ticks, DateTimeKind.Utc);

        DateTime? lastSearchSuccessDateUtc = null;
        if (auc.Results.LastSearchSuccessDate is DateTime)
            lastSearchSuccessDateUtc = new DateTime(((DateTime)auc.Results.LastSearchSuccessDate).Ticks, DateTimeKind.Utc);

        lblInstall.Text += lastInstallationSuccessDateUtc.ToString();
        lblSearch.Text += lastSearchSuccessDateUtc.ToString();

有没有人在这方面有一些专业知识?真的很想把这件事做好!

感谢您花时间阅读!

尊敬的,马歇尔

4

0 回答 0