我正在尝试收集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("tt" + 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("ttt" + 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();
有人在这方面有一些专业知识吗?真的想把这件事做好!
感谢您抽出宝贵时间阅读!
恭敬地 马歇尔
查找已安装软件的所有各种方法都是不完整的,因此我在Get-KbInstalledUpdate中使用了多种方法,我将其描述为:
替换 Get-Hotfix、Get-Package、搜索注册表和搜索 CIM 以获取更新
虽然我没有尝试过这种方式,但本质上是:
$session = New-Object -ComObject "Microsoft.Update.Session"
$updatesearcher = $session.CreateUpdateSearcher()
$count = $updatesearcher.GetTotalHistoryCount()
$updates = $updatesearcher.QueryHistory(0, $count)