远程触发 WSUS 下载的更新安装

远程触发 WSUS 下载的更新安装

这个问题困扰了我一段时间。我们将服务器设置为仅下载 Windows 更新,以便在每两个月一次的补丁窗口期间安装它们。我四处寻找在此期间在服务器上远程触发安装的方法,这样我就不必登录一百台或更多台服务器并单击“立即安装更新”提示框。

有人知道如何远程触发更新安装吗?

答案1

我终于搞明白了。有一个(几乎没有)记录的 Windows 更新 API,您可以使用它来触发这些类型的操作。我使用了修改后的脚本这里这与您可以获得的文档尽可能接近。

我对其进行了如下修改,删除了下载部分 - 因为我使用 GPO 和 WSUS 控制下载以及所有提示。然后我插入了一些代码,以便在更新需要时重新启动该框。

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software'")


WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If


Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update) 
    End If
Next

'WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
'strInput = WScript.StdIn.Readline
'WScript.Echo 

'If (strInput = "N" or strInput = "n") Then 
'   WScript.Quit
'ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()

    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    If (installationResult.RebootRequired = True) Then
        Set RebootShell = WScript.CreateObject("Wscript.Shell")
        RebootShell.Run "shutdown.exe -r -t 0"
    End If

    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
     "and individual installation results:" 

    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode         
    Next
'End If

下一步是将其与 psExec 粘合在一起 - 它不喜欢远程运行 VBScript。我整理了以下批处理文件,将脚本本地复制到服务器,然后以系统用户身份运行 psExec 开始安装:

for /f %%i in (%1) do copy installUpdates.vbs \\%%i\c$
psexec @%1 -s cscript C:\installUpdates.vbs

此时,您需要做的就是将一个包含计算机名称的文本文件传递给批处理脚本 - 每行一个,然后就可以开始了。无需再登录每个服务器来启动 Windows 更新安装!

有点烦人的问题是,这在很大程度上是连续执行的,因此如果您有很多更新,则可能需要一段时间。除了拆分您的机器列表并运行批处理文件的多个副本外,我找不到解决这个问题的好方法。这不是世界末日。


一点点更新。我发现有些安装只需要以适当的权限交互登录即可安装。基本上,如果 wsus 说安装失败,你就得登录到盒子上。虽然这比必须登录到每个盒子要好得多。

答案2

使用 GPO 将它们设置为在您的窗口的时间范围内自动安装,然后在您的双月窗口滚动前几个小时才批准任何更新?

您仍然可以为测试台机器批准它们,看看它们是否会导致世界崩溃,这确保它们都在窗口之前下载,并在您离开办公室之前在更新窗口期间为所有服务器批准它们(我假设这是在早上你不想起床的某个不合时宜的时间),它们应该都在你第二天来的时候完成。

答案3

如果要非顺序运行,只需在 PSEXEC 命令行中添加 -d。然后它将以非交互方式运行 installupdates.vbs。

答案4

还有Wu安装。免费版本似乎并不比您整理的 WUA API 脚本更好,但专业版有一个自动接受 eula 的选项,我想这就是导致大多数交互式更新所必需的原因。

相关内容