Usuário com melhor resposta
Script para pesquisar HOTFIX

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
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
- Sugerido como Resposta Fábio JrModerator terça-feira, 7 de fevereiro de 2012 14:49
- Marcado como Resposta Fábio JrModerator quinta-feira, 9 de fevereiro de 2012 15:38
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- Sugerido como Resposta Fábio JrModerator segunda-feira, 6 de fevereiro de 2012 18:26
-
-
-
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
-
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
- Sugerido como Resposta Fábio JrModerator terça-feira, 7 de fevereiro de 2012 14:49
- Marcado como Resposta Fábio JrModerator quinta-feira, 9 de fevereiro de 2012 15:38
-
-
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
-
-
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