重新启动后如何远程检测Windows已完成补丁程序配置


10

我们计划自动为构建基础架构创建VM,以便我们能够:

  1. 根据需求扩展构建资源,例如,在需要时添加更多构建代理,在不需要时将其删除
  2. 如果/当机器死机时,重新创建全部或部分构建环境
  3. 当我们需要测试设置时,复制构建环境

此过程中的步骤之一是自动创建VM基本映像(在我们的示例中使用Hyper-V)。为此,我们有一个脚本:

  1. 使用Convert-WindowsImage脚本从ISO创建新的VHDX 。我们目前正在使用Windows 2012R2,但将在2016年推出时尽快开始使用。
  2. 使用我们需要的所有基本配置将无人参与脚本添加到新的VHDX
  3. 使用Apply-WindowsUpdate脚本用最新的Windows补丁更新VHDX
  4. 基于VHDX创建新的Hyper-V VM并启动它
  5. 等待虚拟机启动,等待WinRM服务准备好接受远程连接
  6. 等待Windows完成初始配置和新补丁的配置
  7. 应用其他补丁
  8. 重新启动以完成最新补丁程序的配置
  9. 等待Windows完成补丁配置
  10. 将sysprep脚本推送到计算机并调用该脚本。这将运行sysprep,然后关闭计算机
  11. 删除VM但保留VHDX
  12. 从VHDX删除sysprep和无人参与文件,然后压缩VHDX
  13. 将VHDX移动到模板位置并标记为只读

我们遇到的问题在步骤6和9中。理想情况下,在重新启动/关闭计算机之前,我们等待所有配置完成,但是似乎无法检测到Windows已完成配置阶段。

通过UI时,很清楚什么时候完成了任何一个步骤,因为只有在过程准备好之后,登录UI才会显示。但是,当使用WinRM远程连接到计算机时,这不太清楚,因为WinRM可以在完成配置工作之前提供对计算机的访问权限。

因此,问题是,通过Windows已经完成配置更新等的远程连接检测的最简单方法是什么,以便我们可以重新启动/关闭计算机而不会在以后引起问题。

------编辑-----

最后,我们使用的是Katherine答案的修改版本,因为我们的脚本还会等待windeployngen完成。鉴于要ngen等到操作系统完成初始化工作后,才能完成工作,而且作为奖励,最终的VHDX将具有ngen-ed的所有.NET框架,这意味着我们在创建新的.NET框架时无需进行处理。模板磁盘的虚拟机。如果有人感兴趣,我们用于创建VHDX模板的脚本和用于创建本地测试环境的脚本都位于github上。

Answers:


6

这听起来像是一个奇怪的答案,但是...

有一个PowerShell脚本,用于检查是否有Nagios的可用更新。如果没有Nagios,您可能会出于目的使用此脚本或变体。

至于它们是否正在进行,请检查Wuauclt和TrustedInstaller是否正在运行。 Microsoft有关服务器核心更新的建议可能对您有所帮助

根据安装的更新,您可能需要重新启动计算机,尽管系统不会对此进行通知。若要确定安装过程是否已完成,请使用任务管理器来验证Wuauclt或Trusted Installer进程是否未在积极运行。您还可以使用“查看已安装的更新”部分中的方法来检查已安装的更新列表。

您可能可以使用来获取该信息Get-Process -Computername YourImage TrustedInstaller.exe。Wuauclt和TrustedInstaller进程都完成之后,应该可以安全地重新启动。


该脚本解决了获取更新并检测是否需要重新启动的问题,这是我们可能需要解决的另一个问题,但是该脚本不会处理等待重新启动完成以使机器准备工作的时间。 。
Petrik

您在我编辑时发表了评论。我添加了一些有关在Server Core中检测该状态的信息,这接近于远程进行。
凯瑟琳·维尔德

1
我太乐于评论了。我将看看搜索Wuauclt或TrustedInstaller。
Petrik

我当时有点“命中注定”,开心的自己。:)
凯瑟琳·维尔德

1
这种方法几乎对我有用,除了TrustedInstaller和Wuauclt都在初始化完成之前终止。添加windeploy和ngen之后,脚本将等待计算机完成所有初始化(可能是因为ngen直到计算机完成初始化之后才完成)。
Petrik

3

每个Windows更新修补程序都会在安装事件日志中写入几个事件。

  • 事件ID 1-初始化程序包KB ####的更改
  • 事件ID 4-必须重新启动才能将软件包KB ####更改为已安装状态
  • 事件ID 2-程序包KB ####已成功更改为“已安装”状态

确定已应用所有补丁的一种方法是循环检查事件ID4。将事件的时间与当前时间进行比较。如果在5或10分钟内未写入事件ID 4,则可能已完成所有修补程序,并准备重新启动。

我不清楚您是要在补丁安装完成后进行第一次重启(事件4),还是要在配置完成后进行第二次重启(事件2)。此代码执行前者。只需在步骤10之前将filterHashTable更改为事件ID 2,即可进行其他重新引导。

$target = "bart"
$found = $false
while (-not $found) {
    $lastEvent4 = (get-winevent -comp $target -maxEvents 1 -filterHashTable @{ Logname='Setup'; id = '4';}).timeCreated
    if (((get-date) - $lastEvent4).totalMinutes -gt 10) {
        "do reboot"
        restart-computer -comp -$target
        $found = $true
    } else {
        "wait"
        start-sleep 60
    }
}

写下所有开始安装的软件包的KB ID并仅在没有更多更新正在进行时才假定完成才行吗?
西蒙·里希特

补丁程序列表每个月的星期二都会更改。每个月更新该流程以使用新列表将是一个持续的维护点……我认为我的建议会更简单。
克莱顿

1
我的意思是扩展您的答案:当更新开始安装时(事件1),它将被添加到列表中,并在报告完成时被删除(事件4)。通过一些调整(更新失败,重启后列表重置吗?),应该可以确定是否仍在进行安装。
西蒙·里希特

因此,很遗憾,对于全新安装,事件日志中没有任何条目。在计算机初始化之后,我没有尝试安装,但是我认为这种方法在这种情况下可以正常工作。
Petrik

全新安装?困惑。您在这里有一个13个步骤的过程。您要求第6步和第9步提供帮助。您的问题是“一种检测Windows是否已完成配置阶段的方法”,而不是开始部署补丁的方法。
克莱顿

0

我通过以下方法取得了成功:等待Windows将Windows模块安装程序服务(也称为TrustedInstaller)的启动类型更改为“手动(要求启动)”-重新启动后。此时,更新已完成安装。

补丁安装后,“受信任的安装程序”进程有时会继续运行吗?但是,服务启动类型仍然重置为“手动”。

您可以通过查看先前的事件日志消息并在系统日志和安装程序日志之间建立关联,来验证上述观察是否一致/正确。

Windows Module Installer的启动更改将记录为7040系统事件,并且它与重新启动后的安装日志中的最后一个事件2相关。

我认为,在首次安装更新时,如果需要重新启动,此服务将设置为“自动启动”。安装最后一个补丁时,它会重新设置为“手动”(无论是否需要重新启动)。

在某些服务器上,我注意到,受信任的Installer启动会迅速从“手动”切换为“自动”,然后又切换回“自动”,这可能每小时发生一次。我怀疑这是一些正在定期检查更新的应用程序。但是,根据我的经验,通常可以假设,如果启动是手动的,则不会发生补丁。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.