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