Listando os Updates aplicados no Servidor


Pessoal,

Hoje na nossa lista de SQL Server, um amigo perguntou qual seria a melhor maneira de lista todos os updates  aplicados no servdior, com data e descrição deles.

Meu grande amigo Demétrio que manda muito bem em PowerShell, mostrou a IUpdateHistoryEntry Interface . Ai foi só brincar com ela :

Primeiro Script :

Este script retorna um

TypeName: System.__ComObject#{c2bfb780-4539-4132-ab8c-0a8772013ab6}  que é um Objeto Com.

   1: function Get-Updates { 

   2:  

   3: [CmdletBinding()]

   4:  

   5:     Param (

   6:         [Parameter(position=0,Mandatory = $true,ValueFromPipeline = $true,ValueFromPipelinebyPropertyName=$true)][String] $ComputerName

   7:  

   8:     )

   9:     begin 

  10:     {

  11:         [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.Update.Session') | Out-Null

  12:     }

  13:     process {

  14:     

  15:         $session =  [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session",$ComputerName))

  16:         $us = $session.CreateUpdateSearcher()

  17:         $qtd = $us.GetTotalHistoryCount()

  18:         $hot = $us.QueryHistory(1, $qtd)

  19:         $hot 

  20:                         

  21:             

  22:     }

  23:  

  24: }

Segundo Script :

O segundo retorna um PSObject, (Custom Object) .formatado

TypeName: System.Management.Automation.PSCustomObject

   1:  

   2:  

   3: function Get-Updates { 

   4:  

   5: [CmdletBinding()]

   6:  

   7:     Param (

   8:         [Parameter(position=0,Mandatory = $true,ValueFromPipeline = $true,ValueFromPipelinebyPropertyName=$true)][String] $ComputerName

   9:  

  10:     )

  11:     begin 

  12:     {

  13:         [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.Update.Session') | Out-Null

  14:     }

  15:     process {

  16:     

  17:         $session =  [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session",$ComputerName))

  18:         $us = $session.CreateUpdateSearcher()

  19:         $qtd = $us.GetTotalHistoryCount()

  20:         $hot = $us.QueryHistory(1, $qtd)

  21:     

  22:         foreach ($Upd in $hot) {

  23:             $Property = @{     

  24:                             'ServerName'=$computername; 

  25:                             'UpdateDate'=$Upd.date ;

  26:                             'UpdateTitle'=$Upd.title;

  27:                             'UpdateDescription'=$Upd.Description;

  28:                             'UpdateClientApplicationID'=$Upd.ClientApplicationID

  29:                         }

  30:             Write-Output (New-Object -Type PSObject -Prop $Property)    

  31:             

  32:         }

  33:  

  34:  

  35:     }

  36: }

  37:  

  38:  

  39:  

Tá mas qual a diferença de cada um :

No primeiro script (mais rápido), trabalhamos com o que chamamos de objeto vivo, ou seja, todas as propriedades, metodos, type information são preservados. Ex Se eu usar o get-process, posso usar os métodos dele para matar um processo.

No segundo script, o objeto de output está formatado. É mais lento, mas ocupa menos RAM e o somente as custom properties são preservadas. Este método é interessante caso você queira mesclar valores de objetos diferentes em uma unica saida.

Qual é o melhor ? Aquele que se adapta a sua necessidade.

Então se eu quiser  ver os SP, hot fix..enfim todo os updates do servidor 1

   1: Get-Updates Server1

image

Vamos escalar ?

Server1,Server2,Server3 | get-updates

ou então salvar os servidores em um txt

image

e usar o cmdet get-content

   1: get-content c:\temp\servers.txt | get-updates

E pra mandar pra um txt ?

   1: get-content c:\temp\servers.txt | get-updates | out-file c:\servers\audit.txt

 

Agora vamos mandar pra uma tabela do SQL Server ?

Vamos usar duas funções do meu amigo e mentor Chad Miller, a Write-DataTable e a Out-DataTable (abaixo terá o llink com todas as funções)

Para gravar no SQL Server, sem ter que ir linha a linha, primieramente temos que formatar a saida do objeto para um data table e depois importar (se você ver o codigo da Write-DataTable perceberá que usa Bulk Insert)

Primeiramente vamos criar a tabela no sql server ;

   1: CREATE TABLE [dbo].[UpdateInventory](

   2:     [ServerName] [varchar](50) NULL,

   3:     [UpdateDate] [varchar](max) NULL,

   4:     [UpdateTitle] [varchar](max) NULL,

   5:     [UpdateDescription] [varchar](max) NULL,

   6:     [UpdateClientApplicationID] [varchar](max) NULL

   7: ) ON [PRIMARY]

   8:  

   9: GO

e então vamos ao codigo final usando o segundo exemplo

Inserindo somente um servidor ;

   1:  

   2: $variable = Get-Updates -ComputerName Server1 | select  ServerName,UpdateDate,UpdateTitle,UpdateDescription,UpdateClientApplicationID

   3: $valuedatatable = Out-DataTable -InputObject $variable 

   4: Write-DataTable -ServerInstance ServerRepository -Database Dbrepository -TableName UpdateInventory -Data $valuedatatable

Escalando no codigo :

   1: $variable = @('Server1','Server2','Server3' | get-updates |select  ServerName,UpdateDate,UpdateTitle,UpdateDescription,UpdateClientApplicationID  )

   2: $valuedatatable = Out-DataTable -InputObject $variable 

   3: Write-DataTable -ServerInstance ServerRepository -Database Dbrepository -TableName UpdateInventory -Data $valuedatatable

Escalando por txt

   1: $variable = @(Get-Content c:\temp\servers.txt | get-updates |select  ServerName,UpdateDate,UpdateTitle,UpdateDescription,UpdateClientApplicationID  )

   2: $valuedatatable = Out-DataTable -InputObject $variable 

   3: Write-DataTable -ServerInstance ServerRepository -Database Dbrepository -TableName UpdateInventory -Data $valuedatatable

É isso ai galera…pra quem ainda acha que DBA não tem que saber PowerShell.

Com 3 linhas eu escalo pra 1000 servidores .

Te desafio a fazer em menos Smile

download

#PowershellLifeStyle

POWERSHELL ROCKS

could stick around a little longer with you, hello.
It doesn’t really mean that I’m into you, hello.
You’re alright but I’m here, darling, to enjoy the party.
Don’t get too excited ’cause that’s all you get from me, hey.
Yeah, I think you’re cute, but really you should know.
I just came to say hello, hello, hello, hello.

I’m not the kinda girl to get messed up with you, hello.
I’ma let you try to convince me to, hello.
It’s alright I’m getting dizzy just enjoy the party.
It’s OK with me if you don’t have that much to say, hey.
Kinda like this game but there’s something you should know.
I just came to say hello, hello, hey, hey.

I could stick around a little longer with you, hello.
It doesn’t really mean that I’m into you, hello.
You’re alright but I’m here, darling, to enjoy the party.
Don’t get too excited cause thats all you get from me hey.
Yeah I think your cute but really you should know.
I just came to say hello, hello, hello, hello.

Hello

Martin Solveig

About Laerte Junior

Laerte Junior Laerte Junior is a SQL Server specialist and an active member of WW SQL Server and the Windows PowerShell community. He also is a huge Star Wars fan (yes, he has the Darth Vader´s Helmet with the voice changer). He has a passion for DC comics and living the simple life. "May The Force be with all of us"
This entry was posted in Powershell, SQL SERVER EM GERAL, Virtual Pass BR. Bookmark the permalink.

1 Response to Listando os Updates aplicados no Servidor

  1. Excelente. Mais um artigo top de linha sobre PS.

    Parabéns Lalaaaaaaaaaa.

    Abraço,

    Demétrio Silva

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s