Jaa


WSUS, Windows Update y Server Core

Hola

Pablo, uno de nuestros participantes en el IT Momentum que está muy animado probando Windows Server 2008, me pregunta acerca del compartamiento de una instalación Server Core con respecto a las actualizaciones automáticas.

La respuesta corta es que Server Core mantiene intacto el Agente de Windows Update. Por tanto, correctamente configurado, puede descargar e instalar actualizaciones tanto de Microsoft Update como de un servidor WSUS.

Con respecto a cómo configurarlo, pues igual que siempre. O bien por políticas de grupo, o a mano. Para una configuración rápida del agente, hay un comando rápido:

c:\windows\system32> cscript scregedit.wsf /AU 4

NOTA: Aqui podríamos poner 1, 2, 3 o 5. En Server Core no podemos recibir notificaciones, por lo que no tienen demasiado sentido, asi es que cuidado con los las GPOs que afecten a los Server Cores de la red. El valor 0 deshabilita la descarga e instalación automática de las actualizaciones, pero aun asi se pueden hacer a mano (ver más abajo)

Ahora bien. ¿Como sabemos si esto esta funcionando?. ¿Como fuerzo el chequeo contra Microsoft Update o contra el servidor WSUS en su caso?. ¿Como forzar la instalación de una actualización en particular?

Aqui os dejo algunos scripts que he fusilado de aquí y de allá. Hay que ejecutarlos mediante cscript.

ListInstalledUpdates.vbs

Set objSession = CreateObject("Microsoft.Update.Session")
Set objSearcher = objSession.CreateUpdateSearcher
intHistoryCount = objSearcher.GetTotalHistoryCount

Set colHistory = objSearcher.QueryHistory(1, intHistoryCount)

For Each objEntry in colHistory
Wscript.Echo "Title: " & objEntry.Title
Wscript.Echo "Date: " & objEntry.Date
Wscript.Echo "Service ID: " & objEntry.ServiceID
Wscript.Echo "Support URL: " & objEntry.SupportURL
Wscript.Echo
Next

CheckUpdates.vbs

Set objSearcher = CreateObject("Microsoft.Update.Searcher")
Set objResults = objSearcher.Search("Type='Software'")
Set colUpdates = objResults.Updates

For i = 0 to colUpdates.Count - 1
Wscript.Echo "Title: " & colUpdates.Item(i).Title
Set objIdentity = colUpdates.Item(i).Identity
Wscript.Echo "Revision number: " & objIdentity.RevisionNumber
Wscript.Echo "Update ID: " & objIdentity.UpdateID

    Set objInstallationBehavior = colUpdates.Item(i).InstallationBehavior
Wscript.Echo "Can request user input: " & _
objInstallationBehavior.CanRequestUserInput
Wscript.Echo "Support URL: " & colUpdates.Item(i).SupportURL
Wscript.Echo "Type: " & colUpdates.Item(i).Type
For Each strArticle in colUpdates.Item(i).KBArticleIDs
Wscript.Echo "KB article: " & strArticle
Next
Wscript.Echo
Next

InstallUpdate.vbs (necesita como parámetro el UpdateID que suelta CheckUpdates.vbs)

Set objArgs = WScript.Arguments
Update = objArgs(0)

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

Set objSearcher = CreateObject("Microsoft.Update.Searcher")
Set objResults = objSearcher.Search _
("UpdateID='" & Update & "'")
Set colUpdates = objResults.Updates
objCollection.Add(colUpdates.Item(0))

Set objInstaller = CreateObject("Microsoft.Update.Installer")
objInstaller.Updates = objCollection
Set objInstallResults = objInstaller.Install
Wscript.Echo objInstallResults.RebootRequired
Wscript.Echo objInstallResults.ResultCode

SCWindowsUpdate.vbs (todo lo anterior junto)

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

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 vbCRLF & "Creating collection of updates to download:"

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

    For I = 0 to searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)
WScript.Echo I + 1 & "> adding: " & update.Title
updatesToDownload.Add(update)
Next

    WScript.Echo vbCRLF & "Downloading updates..."

    Set downloader = updateSession.CreateUpdateDownloader()
downloader.Updates = updatesToDownload
downloader.Download()

    WScript.Echo vbCRLF & "List of downloaded updates:"

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

    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

End If

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
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

Saludos

David Cervigón

Comments

  • Anonymous
    March 10, 2011
    Buenas noches. Tengo una pregunta con respecto a los servidores WSUS. como sabemos de vez en cuando hay que depurar la base de datos y hay que hacerlo manualmente. hay alguna manera de crear una tarea agendada para que realice la limpieza, e incluso, una vez que lo haga, te pueda avisar por correo para estar al tanto y optimizar la administracion? reaq252@hotmail.com