有没有办法查明 Windows Server(2003、2008)是否已下载 Microsoft Windows 更新,并且只是等待用户确认“安装更新并重新启动服务器”?
我们使用 WSUS 和 SSCM 来收集和发布更新,并且大多数服务器在周日早上自动安装,主要是开发和测试服务器。
我们已经将重要的生产服务器设置为仅手动安装,但有时某些服务器在一段时间内不会手动重新启动(人类会忘记!)
如果有某种方法(powershell 脚本、WMI 查询、一些神奇的命令)可以让我计算或发现是否有待处理的更新,那就太好了。
答案1
这是我写的脚本。它会告诉你:
- 有多少补丁正在等待安装
- 如果补丁需要重新启动
- 如果服务器目前正在等待重新启动以启用补丁
使用示例:C:\> cscript ServerPendingUpdates.vbs myserver01 myserver02
Connecting to myserver01 to check software update status...
myserver01 has 2 updates pending installation
myserver01 WILL need to be rebooted to complete the installation of these updates.
myserver01 is waiting for a REBOOT to complete a previous installation.
<snip>
脚本:
'#
'# ServerPendingUpdates.vbs
'#
'# Usage: cscript ServerPendingUpdates.vbs {servername} {servername} {servername} {servername}
'# If no {servername} specified then 'localhost' assumed
'#
'# To do: Error handling
'#
Option Explicit
Dim strServer : strServer = GetArgValue(0,"localhost")
'#
'# Loop through the input parameters for each server
'#
Dim i
For i = 0 To WScript.Arguments.Count - 1
CheckServerUpdateStatus GetArgValue(i,"localhost") 'strServer
Next
WScript.Quit(0)
Function CheckServerUpdateStatus( ByVal strServer )
WScript.Echo vbCRLF & "Connecting to " & strServer & " to check software update status..."
Dim blnRebootRequired : blnRebootRequired = False
Dim blnRebootPending : blnRebootPending = False
Dim objSession : Set objSession = CreateObject("Microsoft.Update.Session", strServer)
Dim objUpdateSearcher : Set objUpdateSearcher = objSession.CreateUpdateSearcher
Dim objSearchResult : Set objSearchResult = objUpdateSearcher.Search(" IsAssigned=1 and IsHidden=0 and Type='Software'")
'#
'#
'#
Dim i, objUpdate
Dim intPendingInstalls : intPendingInstalls = 0
For i = 0 To objSearchResult.Updates.Count-1
Set objUpdate = objSearchResult.Updates.Item(I)
If objUpdate.IsInstalled Then
If objUpdate.RebootRequired Then
blnRebootPending = True
End If
Else
intPendingInstalls = intPendingInstalls + 1
'If objUpdate.RebootRequired Then '### This property is FALSE before installation and only set to TRUE after installation to indicate that this patch forced a reboot.
If objUpdate.InstallationBehavior.RebootBehavior <> 0 Then
'# http://msdn.microsoft.com/en-us/library/aa386064%28v=VS.85%29.aspx
'# InstallationBehavior.RebootBehavior = 0 Never reboot
'# InstallationBehavior.RebootBehavior = 1 Must reboot
'# InstallationBehavior.RebootBehavior = 2 Can request reboot
blnRebootRequired = True
End If
End If
Next
WScript.Echo strServer & " has " & intPendingInstalls & " updates pending installation"
If blnRebootRequired Then
WScript.Echo strServer & " WILL need to be rebooted to complete the installation of these updates."
Else
WScript.Echo strServer & " WILL NOT require a reboot to install these updates."
End If
'#
'#
'#
If blnRebootPending Then
WScript.Echo strServer & " is waiting for a REBOOT to complete a previous installation."
End If
End Function
'#
'#
'#
Function GetArgValue( intArgItem, strDefault )
If WScript.Arguments.Count > intArgItem Then
GetArgValue = WScript.Arguments.Item(intArgItem)
Else
GetArgValue = strDefault
End If
End Function
答案2
您可以使用wuinstall。它有一个 /search 开关,用于查看是否有待处理的更新。您可以使用 psexec 进行远程执行。
另一个选择是解析 %windir%\windowsupdate.log 并查找如下内容:# 警告:安装调用已完成,需要重新启动 = 是,错误 = 0x00000000
答案3
我用更新Hf脚本由 Rob Dunn 和贡献者编写。由于它在报告的主机上本地运行,因此我已将其安装在我的所有机器上。我创建了一个 MSI 包并通过 GPO 推送它。
为了触发报告,我收集了一组 powershell 脚本,这些脚本在一个 OU 的服务器上创建计划任务,其中每台机器都计划在本地运行 UpdateHF.vbs 并通过电子邮件将结果发送给我。然后,我使用排序规则根据在报告中搜索到的独特文本对结果电子邮件进行颜色编码。
UpdateHF.vbs 基本上是 Microsoft 已发布的自动更新 API 的包装器,因此,如果您想要的只是一个布尔重启状态标志,我敢打赌,经过一番挖掘,您就能找出哪一段脚本处理“重启挂起”检查。
这是我的系统的核心:Powershell 在调用 schtasks.exe 时填充变量。(请注意,如果密码包含复杂字符,则需要使用反引号对其进行转义。)
schtasks.exe /create /F /S $TargetHost /tn Patch /sc once /st $TargetTime /sd $StartDate /ru User /rp Password /tr "$WinPath\system32\cscript.exe $WinPath\UpdateHF.vbs $UpdateArgs"
答案4
在 2012 R2 服务器上,转到控制面板,单击 Windows 更新。在页面左侧面板上单击“检查更新”链接,您将看到待处理更新列表(尚未安装在服务器上)。单击任何链接,您将看到整个(可选和强制)列表以及每个更新的简短说明。
请注意,必须打开更新的自动安装。