我有许多 Windows 7 PC 需要使用 C# 控制台应用程序中的 Windows 更新 API 修补特定的 Windows 更新。API 需要搜索已安装的更新并报告是否已安装,如果未安装则执行安装。
在虚拟 PC(Windows 7 Professional Hyper-v 客户端)上进行测试时,我遇到了类似于目标 PC(Windows 7 Embedded)的情况,其中以下代码返回(非常快速且无任何异常)0 更新。我知道这是错的。事实上,它甚至会在我安装 .msu 更新后返回。
代码:
UpdateSession uSession = new UpdateSession();
IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher();
uSearcher.Online = false;
try
{
ISearchResult sResult = uSearcher.Search("IsInstalled=1 And IsHidden=0");
Console.WriteLine("Found " + sResult.Updates.Count + " updates");
foreach (IUpdate update in sResult.Updates)
{
Console.WriteLine(update.Title);
if (update.Title.ToLower().Contains("kb123456")) {
//Update is not required
ReportInstalled();
return;
}
}
//If we get here, the update is not installed
InstallUpdate();
}
catch (Exception ex)
{
Console.WriteLine("Something went wrong: " + ex.Message);
}
现在是有趣的部分。如果我从控制面板打开 Windows 更新并单击“检查更新”,它会关闭一段时间,然后回来安装一堆更新。此时,如果我运行上述代码,它会按预期工作并报告超过 200 个已安装更新。
搜索更新的手动过程似乎会启动/重新启动某些服务和/或其他进程,但是,我正在努力弄清楚我需要对系统做什么才能使其进入正确状态。我希望答案将是使用一组参数启动服务 x 或进程 y 的简单案例,但是哪个?
我尝试过但没有改变行为的一些(不是全部)事情:
- 启动 BITS 服务,重新启动 Windows 更新服务
- 尝试使用各种开关启动 wuauclt.exe( 在评论中记录)
在机器处于代码正常运行的状态下(在我手动运行 WU 之后),我注意到在运行上述代码时进程 wuauclt.exe 似乎启动了。当它处于目标状态时(在我手动运行 WU 之前), wuauclt.exe 不会启动,并且我无法手动启动它,我怀疑这是一个很大的线索。
另一个线索是我手动运行 Windows 更新之前的状态。在控制面板窗口更新看起来像这样:
通过该方法运行 WU 并安装更新后,机器处于代码按预期运行的状态,WU 如下所示:
总而言之,我需要这个过程来自动安装更新。如果我检测到 0 个已安装的更新,我知道机器处于特定状态,所以我需要启动/重新启动一些进程和服务(以编程方式)以使机器在运行我的代码之前进入正确的状态。知道要运行/重启什么是这个问题的本质。