none
Script para pesquisar HOTFIX RRS feed

  • Pergunta

  • Olá,

    estou precisando de uma ajuda para a criação de um script que funcione da seguinte maneira:

    Leia um arquivo kbs.txt (que tem a lista de hotfix procurados) e para cada linha pesquise nos servidores do arquivo servidores.txt, informando o resultado da pesquisa em um arquivo log.txt.

     

    Desde já agradeço.

    Hendel

     


    ledneh
    • Tipo Alterado Fábio JrModerator sexta-feira, 3 de fevereiro de 2012 10:34 Alterado o Tipo
    quinta-feira, 2 de fevereiro de 2012 19:26

Respostas

  • Veja, coloquei um filtro na query WMI (o mesmo que eu fazia no PowerShell).

    Coloquei a leitura do KBs.txt dentro do Loop do Computadores, assim vc não precisa daquela "ginástica" de ter aquele arquivo frankstein. Da forma que o script ficou vc tem o computers.txt apenas com o nome dos computadores e o Kbs.txt apenas com os kbs.

    Dá pra melhorar algumas coisas, mas acho que já resolve o seu caso.

    Const ForReading = 1
    Const ForWriting = 2
    Set oShell = CreateObject("WScript.Shell")
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objServers = objFSO.OpenTextFile(".\computer.txt", ForReading)
     
    Set objFile = objFSO.CreateTextFile(".\computer\log.txt", ForWriting)
    
    Do While objServers.AtEndOfStream <> True
    	strServer = objServers.Readline
    
    	Set objHotfix = objFSO.OpenTextFile(".\computer\Kbs.txt", ForReading)
    	Do While objHotfix.AtEndOfStream <> True
    		strHotFix = objHotfix.Readline
    		Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServer & "\root\cimv2")
    		Set colQuickFixes = objWMIService.ExecQuery ("SELECT * FROM Win32_QuickFixEngineering where hotfixid='" & strHotFix & "'")
       
    		For Each objQuickFix in colQuickFixes
    			If objQuickFix.HotFixID = strHotfix then
    				objFile.WriteLine "O Servidor " & strServer & " possui o " & objQuickFix.HotFixID
    			End If
    		Next
       
    	Loop
    	objHotfix.close
    Loop  


    Fábio de Paula Junior

    terça-feira, 7 de fevereiro de 2012 13:04
    Moderador

Todas as Respostas

  • Veja se este PowerShell(.PS1) ajuda

     

    $Arquivo_Servidores = "C:\temp\servidores.txt" 
    $Arquivo_KBs="C:\temp\kbs.txt"
    $Arquivo_Log="C:\temp\log.txt"
    
    #Pega lista de Servidores
    $Servidores = gc $Arquivo_Servidores
    
    #Pega lista de KBs
    $KBs = gc $Arquivo_KBs
    
    #Apaga arquivo de log
    Remove-Item $Arquivo_Log
    
    foreach ($Servidor in $Servidores){
    
        foreach ($KB in $KBs){
       
            $Update = Get-WmiObject -class Win32_QuickFixEngineering -computername $Servidor -namespace "root\CIMV2" -filter "HotFixID='$KB'"
            if ($Update.HotFixID -eq $KB){
                $Saida = "$Servidor;$KB;OK"
            }else{
                $Saida = "$Servidor;$KB;Não instalado"
            }
            write-host $Saida
            $Saida >> $Arquivo_Log
        }
        
    }
    


    Fábio de Paula Junior
    sexta-feira, 3 de fevereiro de 2012 17:53
    Moderador
  • Valeu, Fábio!

     

    Mas o que preciso realmente é em vbs pois não consigo rodar o powershell lá na empresa, estou tentando pegar a idéia e fazer no VBScript. Se eu conseguir eu posto .


    ledneh
    segunda-feira, 6 de fevereiro de 2012 21:32
  • Porque você não consegue rodar o PowerShell?

    Fábio de Paula Junior

    terça-feira, 7 de fevereiro de 2012 10:18
    Moderador
  • Porque acho que o PowerShell não está habilitado, eu não sou ADM da máquina.

    Eu fiz em VBScript mas estou com a seguinte dificuldade:

    Esse é o Vbs que fiz

    ***************************************************************************************

    Const ForReading = 1
    Const ForWriting = 2
    Set oShell = CreateObject("WScript.Shell")

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objServers = objFSO.OpenTextFile(".\computer.txt", ForReading)
    Set objHotfix = objFSO.OpenTextFile(".\computer\Kbs.txt", ForReading)
    Set objFile = objFSO.OpenTextFile (".\computer\log.txt", ForWriting)

    Do While objServers.AtEndOfStream <> True
     strServer = objServers.Readline
     

     Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServer & "\root\cimv2")
      Set colQuickFixes = objWMIService.ExecQuery ("SELECT * FROM Win32_QuickFixEngineering")

     strHotfix = objHotfix.Readline
      For Each objQuickFix in colQuickFixes
       If objQuickFix.HotFixID = strHotfix then
         
          objFile.WriteLine "O Servidor " & strServer & " possui o " & objQuickFix.HotFixID
       End If
      Next
    Loop  
     
    Wscript.Echo "FIM"

    ***************************************************************************************

    Ele até me mostra os hotfix instalados, o problema é que para isso eu preciso deixar os arquivos computer.txt e kbs.txt da seguinte maneira:

    computer.txt               kbs.txt

    pc1                             kb1

    pc1                             kb2

    pc2                             kb1

    pc2                             kb2

    Para cada hotfix procurado eu tenho que especificar o computador, linha a linha, se eu quiser procurar 100 hotfix preciso repetir 100 vezes o nome no computador, isso para cada hofix procurado.

    ***************************************************************************************

    E o que eu preciso seria assim

    computer.txt               kbs.txt

    pc1                             kb1

    pc2                             kb2

    pc3                             kb3

    pc4                             kb4

    Para cada entrada no arquivo computer.txt o script tem que pesquisar todos os do kb.txt

    Obrigado mais uma vez!


    ledneh

    terça-feira, 7 de fevereiro de 2012 11:32
  • Veja, coloquei um filtro na query WMI (o mesmo que eu fazia no PowerShell).

    Coloquei a leitura do KBs.txt dentro do Loop do Computadores, assim vc não precisa daquela "ginástica" de ter aquele arquivo frankstein. Da forma que o script ficou vc tem o computers.txt apenas com o nome dos computadores e o Kbs.txt apenas com os kbs.

    Dá pra melhorar algumas coisas, mas acho que já resolve o seu caso.

    Const ForReading = 1
    Const ForWriting = 2
    Set oShell = CreateObject("WScript.Shell")
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objServers = objFSO.OpenTextFile(".\computer.txt", ForReading)
     
    Set objFile = objFSO.CreateTextFile(".\computer\log.txt", ForWriting)
    
    Do While objServers.AtEndOfStream <> True
    	strServer = objServers.Readline
    
    	Set objHotfix = objFSO.OpenTextFile(".\computer\Kbs.txt", ForReading)
    	Do While objHotfix.AtEndOfStream <> True
    		strHotFix = objHotfix.Readline
    		Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServer & "\root\cimv2")
    		Set colQuickFixes = objWMIService.ExecQuery ("SELECT * FROM Win32_QuickFixEngineering where hotfixid='" & strHotFix & "'")
       
    		For Each objQuickFix in colQuickFixes
    			If objQuickFix.HotFixID = strHotfix then
    				objFile.WriteLine "O Servidor " & strServer & " possui o " & objQuickFix.HotFixID
    			End If
    		Next
       
    	Loop
    	objHotfix.close
    Loop  


    Fábio de Paula Junior

    terça-feira, 7 de fevereiro de 2012 13:04
    Moderador
  • Olá Fábio!

    Está dando erro 80041021 na linha 18.

    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServer & strServer & "\root\cimv2")

    Desde já agradeço,

    Hendel


    ledneh

    quarta-feira, 8 de fevereiro de 2012 13:23
  • A linha que vc passou está sobrando código. Veja a parte em negrito.

    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServer & strServer & "\root\cimv2")

    Eu testei e estava funcionando, a única diferença do código que testei eram os caminhos dos arquivos.


    Fábio de Paula Junior

    quarta-feira, 8 de fevereiro de 2012 14:57
    Moderador
  • Testou o script?

    Fábio de Paula Junior

    quinta-feira, 9 de fevereiro de 2012 10:34
    Moderador
  • Fábio, funcionou sim!

    Obrigado pela ajuda.


    ledneh

    • Marcado como Resposta Ledneh quinta-feira, 9 de fevereiro de 2012 12:13
    • Não Marcado como Resposta Fábio JrModerator quinta-feira, 9 de fevereiro de 2012 15:38
    quinta-feira, 9 de fevereiro de 2012 12:13