Un vistazo rápido a WSUS 3.0 y PowerShell

Soy un enamorado de PowerShell, me recuerda los viejos tiempos y me permite desarrollar mejores soluciones de automatización.


Yo soy un fiel defensor de la automatización, me parece una herramienta fundamental para evitar errores humanos, mejorar los tiempos de respuesta y gestionar los cambios.


Si vas a realizar un cambio y lo puedes meter en un script, correrlo en el entorno de pruebas, ver si funciona y finalmente ejecutar el mismo script en producción, te aseguraras de estar haciendo exactamente lo mismo y si el escenario de pruebas era una fiel reproducción del entorno de producción  tendremos la seguridad de que irá bien.


Es más fácil de documentar pues basta con incluir el script en la gestión de cambios, además hoy en día es fácil contar con entornos de pruebas realistas gracias a las maquinas virtuales.


Desde hace un tiempo estoy realizando además las pruebas también por script, de forma parecida a como en desarrollo se hacen las pruebas unitarias y de integración pero en sistemas, esto me permite ahorrar mucho tiempo a la hora de probar los cambios y garantizar que se han realizado todas las pruebas que se tienen que realizar antes de dar un cambio como nuevo.


Como sabréis los scripts de powershell los podremos hacer con herramientas como el poweranalyzer o bien usar el bloc de notas, yo soy fan del bloc de notas también conocida como “la herramienta más poderosa jamás desarrollada”, a los scripts los tendremos que llamar con la extensión .PS1.


Para poder ejecutar un script tendremos que haber configurado el entorno de powershell con una política de ejecución de scripts, esto indicara a powershell si puede ejecutar scripts no firmados o si es obligatorio firmarlos (entre otras opciones), mirar la documentación de powershell para mas información o bien usar el comando “get-help set-executionpolicy –detailed” para leer la ayuda en pantalla.


Una vez que tengáis la política ya configurada podréis ejecutar los scripts.


Lo primero que tendremos que hacer en el script, será indicar a PowerShell que cargue el assembly con la API de WSUS 3.0.


[reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration») | out-null


Después tendremos que crear un objeto que referencie al servidor wsus, en este caso lo haremos al servidor desde el que estamos corriendo el script.


$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();


Para ver todos los métodos y propiedades que nos expone el servidor podemos usar el cmdlet get-member.


Por lo tanto el siguiente script:


[reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration») | out-null
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();


$wsus | get-member


Nos devolverá esto:


PS C:Documents and SettingsAdministrator.ADROOT> ./wsus2.ps1



   TypeName: Microsoft.UpdateServices.Internal.BaseApi.UpdateServer


Name                                 MemberType Definition
—-                                 ———- ———-
CancelAllDownloads                   Method     System.Void CancelAllDownloads()
CreateComputerTargetGroup            Method     Microsoft.UpdateServices.Administration.IComputerTargetGroup CreateC.
CreateInstallApprovalRule            Method     Microsoft.UpdateServices.Administration.IAutomaticUpdateApprovalRule.
CreateObjRef                         Method     System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType)
DeleteInstallApprovalRule            Method     System.Void DeleteInstallApprovalRule(Int32 ruleId)
DeleteUpdate                         Method     System.Void DeleteUpdate(Guid updateId)
Equals                               Method     System.Boolean Equals(Object obj)
ExportUpdates                        Method     System.Void ExportUpdates(String packagePath, String logPath)
GetChildServers                      Method     Microsoft.UpdateServices.Administration.DownstreamServerCollection G.
GetCleanupManager                    Method     Microsoft.UpdateServices.Administration.ICleanupManager GetCleanupMa.
GetComponentsWithErrors              Method     System.Collections.Specialized.StringCollection GetComponentsWithErr.
GetComputersNotContactedSinceCount   Method     System.Int32 GetComputersNotContactedSinceCount(DateTime fromDate)
GetComputerStatus                    Method     Microsoft.UpdateServices.Administration.UpdateServerStatus GetComput.
GetComputersWithRecentNameChange     Method     System.Collections.Specialized.StringCollection GetComputersWithRece.
GetComputerTarget                    Method     Microsoft.UpdateServices.Administration.IComputerTarget GetComputerT.
GetComputerTargetByName              Method     Microsoft.UpdateServices.Administration.IComputerTarget GetComputerT.
GetComputerTargetCount               Method     System.Int32 GetComputerTargetCount(), System.Int32 GetComputerTarge.
GetComputerTargetGroup               Method     Microsoft.UpdateServices.Administration.IComputerTargetGroup GetComp.
GetComputerTargetGroups              Method     Microsoft.UpdateServices.Administration.ComputerTargetGroupCollectio.
GetComputerTargets                   Method     Microsoft.UpdateServices.Administration.ComputerTargetCollection Get.
GetConfiguration                     Method     Microsoft.UpdateServices.Administration.IUpdateServerConfiguration G.
GetContentDownloadProgress           Method     Microsoft.UpdateServices.Administration.ContentDownloadProgress GetC.
GetCurrentUserRole                   Method     Microsoft.UpdateServices.Administration.UpdateServerUserRole GetCurr.
GetDatabaseConfiguration             Method     Microsoft.UpdateServices.Administration.IDatabaseConfiguration GetDa.
GetDownstreamServer                  Method     Microsoft.UpdateServices.Administration.IDownstreamServer GetDownstr.
GetDownstreamServers                 Method     Microsoft.UpdateServices.Administration.DownstreamServerCollection G.
GetEmailNotificationConfiguration    Method     Microsoft.UpdateServices.Administration.IEmailNotificationConfigurat.
GetFailedToDownloadUpdatesCount      Method     System.Int32 GetFailedToDownloadUpdatesCount()
GetFrontEndServers                   Method     System.Collections.ObjectModel.ReadOnlyCollection`1[[Microsoft.Updat.
GetHashCode                          Method     System.Int32 GetHashCode()
GetInstallApprovalRules              Method     Microsoft.UpdateServices.Administration.AutomaticUpdateApprovalRuleC.
GetLifetimeService                   Method     System.Object GetLifetimeService()
GetPublisher                         Method     Microsoft.UpdateServices.Administration.IPublisher GetPublisher(Stri.
GetReplicaStatus                     Method     Microsoft.UpdateServices.Administration.UpdateServerStatus GetReplic.
GetRootUpdateCategories              Method     Microsoft.UpdateServices.Administration.UpdateCategoryCollection Get.
GetStatus                            Method     Microsoft.UpdateServices.Administration.UpdateServerStatus GetStatus.
GetSubscription                      Method     Microsoft.UpdateServices.Administration.ISubscription GetSubscription
GetSubscriptionEvent                 Method     Microsoft.UpdateServices.Administration.ISubscriptionEvent GetSubscr.
GetSummariesPerComputerTarget        Method     Microsoft.UpdateServices.Administration.UpdateSummaryCollection GetS.
GetSummariesPerUpdate                Method     Microsoft.UpdateServices.Administration.UpdateSummaryCollection GetS.
GetSynchronizationInfo               Method     Microsoft.UpdateServices.Administration.ISynchronizationInfo GetSync.
GetType                              Method     System.Type GetType()
GetUpdate                            Method     Microsoft.UpdateServices.Administration.IUpdate GetUpdate(UpdateRevi.
GetUpdateApproval                    Method     Microsoft.UpdateServices.Administration.IUpdateApproval GetUpdateApp.
GetUpdateApprovals                   Method     Microsoft.UpdateServices.Administration.UpdateApprovalCollection Get.
GetUpdateCategories                  Method     Microsoft.UpdateServices.Administration.UpdateCategoryCollection Get.
GetUpdateCategory                    Method     Microsoft.UpdateServices.Administration.IUpdateCategory GetUpdateCat.
GetUpdateClassification              Method     Microsoft.UpdateServices.Administration.IUpdateClassification GetUpd.
GetUpdateClassifications             Method     Microsoft.UpdateServices.Administration.UpdateClassificationCollecti.
GetUpdateCount                       Method     System.Int32 GetUpdateCount(), System.Int32 GetUpdateCount(UpdateSco.
GetUpdateEventHistory                Method     Microsoft.UpdateServices.Administration.UpdateEventCollection GetUpd.
GetUpdates                           Method     Microsoft.UpdateServices.Administration.UpdateCollection GetUpdates(.
GetUpdatesAndApprovals               Method     Microsoft.UpdateServices.Internal.BaseApi.UpdatesAndApprovals GetUpd.
GetUpdateStatus                      Method     Microsoft.UpdateServices.Administration.UpdateServerStatus GetUpdate.
get_BypassApiRemoting                Method     System.Boolean get_BypassApiRemoting()
get_IsConnectionSecureForApiRemoting Method     System.Boolean get_IsConnectionSecureForApiRemoting()
get_IsServerLocal                    Method     System.Boolean get_IsServerLocal()
get_Name                             Method     System.String get_Name()
get_PortNumber                       Method     System.Int32 get_PortNumber()
get_PreferredCulture                 Method     System.String get_PreferredCulture()
get_ServerName                       Method     System.String get_ServerName()
get_Version                          Method     System.Version get_Version()
get_WebServiceUrl                    Method     System.String get_WebServiceUrl()
HasApprovalsChanged                  Method     System.Boolean HasApprovalsChanged(String cookie)
ImportUpdateFromCatalogSite          Method     System.Void ImportUpdateFromCatalogSite(String updateIdStr, String[].
ImportUpdates                        Method     System.Void ImportUpdates(String packagePath, String logPath)
InitializeLifetimeService            Method     System.Object InitializeLifetimeService()
IsValidComputerTargetGroupName       Method     System.Boolean IsValidComputerTargetGroupName(String name)
LogMessage                           Method     System.Void LogMessage(LogLevel logLevel, String message, Params Obj.
RegisterComputer                     Method     Microsoft.UpdateServices.Administration.IComputerTarget RegisterComp.
ResetAndVerifyContentState           Method     System.Void ResetAndVerifyContentState()
ResumeAllDownloads                   Method     System.Void ResumeAllDownloads()
RollupReportingData                  Method     System.Void RollupReportingData()
SearchComputerTargets                Method     Microsoft.UpdateServices.Administration.ComputerTargetCollection Sea.
SearchUpdates                        Method     Microsoft.UpdateServices.Administration.UpdateCollection SearchUpdat.
set_PreferredCulture                 Method     System.Void set_PreferredCulture(String value)
ToString                             Method     System.String ToString()
BypassApiRemoting                    Property   System.Boolean BypassApiRemoting {get;}
IsConnectionSecureForApiRemoting     Property   System.Boolean IsConnectionSecureForApiRemoting {get;}
IsServerLocal                        Property   System.Boolean IsServerLocal {get;}
Name                                 Property   System.String Name {get;}
PortNumber                           Property   System.Int32 PortNumber {get;}
PreferredCulture                     Property   System.String PreferredCulture {get;set;}
ServerName                           Property   System.String ServerName {get;}
Version                              Property   System.Version Version {get;}
WebServiceUrl                        Property   System.String WebServiceUrl {get;}


A partir de esto y con un poco de maña y conocimientos de PowerShell podremos hacer verdaderas virguerías.


Una pista: el metodo GetComputerTargets() nos retornara una coleccion con todos los ordenadores administrados por el wsus al que estemos conectados, cada objeto de esa coleccion sera un ordenador y tendra sus propios metodos y propiedades que son:


CreateObjRef
Delete
Equals
GetComputerTargetGroups
GetHashCode
GetInventory
GetLifetimeService
GetParentServer
GetType
GetUpdateInstallationInfoPerUpdate
GetUpdateInstallationSummary
get_BiosInfo
get_ClientVersion
get_ComputerRole
get_ComputerTargetGroupIds
get_FullDomainName
get_Id
get_IPAddress
get_LastReportedInventoryTime
get_LastReportedStatusTime
get_LastSyncResult
get_LastSyncTime
get_Make
get_Model
get_OSArchitecture
get_OSDescription
get_OSInfo
get_ParentServerId
get_RequestedTargetGroupName
get_RequestedTargetGroupNames
get_SyncsFromDownstreamServer
get_UpdateServer
InitializeLifetimeService
PurgeAssociatedReportingEvents
set_BiosInfo
set_ClientVersion
set_FullDomainName
set_Id
set_IPAddress
set_LastReportedInventoryTime
set_LastReportedStatusTime
set_LastSyncResult
set_LastSyncTime
set_Make
set_Model
set_OSArchitecture
set_OSInfo
set_ParentServerId
set_RequestedTargetGroupName
ToString
BiosInfo
ClientVersion
ComputerRole
ComputerTargetGroupIds
FullDomainName
Id
IPAddress
LastReportedInventoryTime
LastReportedStatusTime
LastSyncResult
LastSyncTime
Make
Model
OSArchitecture
OSDescription
OSInfo
ParentServerId
RequestedTargetGroupName
RequestedTargetGroupNames
SyncsFromDownstreamServer
UpdateServer


 

Un comentario sobre “Un vistazo rápido a WSUS 3.0 y PowerShell”

  1. Hola Sauron,

    Tengo instalada la Powershell en un equipo con Win XP SP2. Los archivos con extensión PS1 no me aparecen asociados a Powershell, ¿es un problema de instalación? ¿Debería hacerlo yo a mano?

    Gracias por estas entradas tan interesantes 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *