Regenera o ID do cliente do WSUS e registra a conta novamente no servidor
Prezados,
Esse script é um dos mais interessantes que já tive a oportunidade de contruir junto com meu amigo Daniel Cordeiro. Inicialmente ele parece ser bem simples, mas na mão do administrador do WSUS ele se torna uma poderora ferramenta de apoio.
Quando tive a oportunidade de participar da implantação do WSUS em nosso ambiente, ficavamos sempre com a impressão que tinhamos mais máquinas na planta do que na realidade apresentada pelo console do servidor. Após vários dias pesquisando as documentações do produto, visitando vários foruns como por exemplo o excelente http://www.wsus.info/forums/ desenvolvemos o script a seguir.
1 - O script identifica os hostnames destino a partir de uma lista de máquinas que devem ser armazenadas no arquivo "computadores.txt.
2 - Conecta na estação destino e verifica o Sistema Operacional.
3 - Para o serviço do Automatic Updates e inicia o serviço de Registro Remoto.
4 - Deleta todo o conteúdo da pasta SoftwareDistrution e as chaves do registro referentes ao Id máquina no wsus
5 - Reinicia todos os serviços
6 - Força o registro da máquina no servidor WSUS e verifica se existe atualizações disponíveis para a estação.
7 - Por último ele coloca tudo isso em um arquivo de log chamado "Resultado.txt".
Conclusão: Com essa ferramenta conseguimos no perído de 02 a 03 dias aumentar em 1.000 a quantidade de máquinas cadastradas na console do WSUS.
'*** Inicio do código*************************************
'Título = Reseta o ID do client WSUS e Registra Novamente a conta.
'Autor = Marcelo Montezuma / Daniel Henrique Cordeiro
'Pagina = SUPORTE & SCRIPTS - scriptonita.blogspot.com
'versão = Beta 1.0
'Contato = Marcelo Montezuma - marcelo.montezuma@gmail.com
'Inicio -------------------------------------------------------------
Dim arrFolders()
Const HKEY_LOCAL_MACHINE = &H80000002
Const forReading = 1
Const forWriting = 2
Const forAppending = 8
Dim srcFile , logFile
'Define a lista de computadores e o arquivo de log------------------
srcFile = "computadores.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(srcFile, 1)
logFile = "Resultado.txt"
Set oFsOutput = CreateObject("scripting.filesystemobject")
Set oTextOutput = oFsOutput.OpenTextFile(logFile, forAppending, True)
'Abre o arquivo de texto e define o hostname-------------------------
Do Until objTextFile.AtEndOfStream
Dim ObjComputer
intSize = 0
ObjComputer = objTextFile.ReadLine
strComputer = ObjComputer
'Conecta a estação e verifica erro ------------------------------------
On Error Resume Next
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
If Err.Number = 0 Then
oTextOutput.writeLine
oTextOutput.writeLine (strComputer & ";" & "Reset do cliente wsus iniciado" & ";" & Now)
Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
'Verfica o SO da estação ------------------------------------------------------
For Each objOS In colOSes
Dim strOSType
strOSType = objOS.Caption
Select Case strOSType
Case "Microsoft Windows XP Professional"
strFolderName = "c:\Windows\SoftwareDistribution"
oTextOutput.writeLine (strComputer & ";" & "Sistema Operacional" & ";" & strOSType)
Case "Microsoft Windows 2000 Professional"
strFolderName = "c:\Winnt\SoftwareDistribution"
oTextOutput.writeLine (strComputer & ";" & "Sistema Operacional " & ";" & strOSType)
Case Else
oTextOutput.writeLine (strComputer & ";" &"Falha ao detectar o OS ")
End Select
Next
Else
strDescricao = Err.Description
strErroNumero = Err.Number
oTextOutput.writeLine
oTextOutput.writeLine (strComputer & ";" & "Erro nº:" & strErroNumero & ";" & strDescricao & ";" & Now)
End If
' Para o serviço do Windows update e altera o registro remoto -----------------------------------
If Err.Number = 0 Then
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='RemoteRegistry'")
For Each objService in colServiceList
errReturn = objService.Change (, , , , "Manual")
errReturn = objService.StartService()
Next
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='wuauserv'")
For Each objService In colServiceList
errReturn = objService.StopService()
On Error Resume Next
oTextOutput.writeLine (strComputer & ";" & "Serviço parado com sucesso ")
Next
End If
'-------------------Verifica se o serviço já está parado
If Err.Number = 0 Then
Dim SS
Dim statusS
dim strData1
dim srtData2
dim strResult
strdata1 = formatDateTime(now,shorttime)
SS = 0
While SS = 0
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='wuauserv'")
For Each objService In colServiceList
statusS = objService.State
Next
If statusS = "Stopped" Then
SS = 1
End If
strData2 = formatDateTime(now,shorttime)
strResult = datediff("s",strdata1,strData2)
if strresult= 120 then
SS=1
end if
Wend
End If
'Conecta o Registro e deleta as chaves do WSUS --------------------------------------------
On Error Resume Next
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")
If Err.Number = 0 Then
oTextOutput.writeLine
oTextOutput.writeLine (strComputer & ";" & "Reset do registro wsus iniciado " & Now)
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate"
strDWORDValueName = "AccountDomainSid"
strStringValueName = "SusClientId"
oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strDWORDValueName
oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strStringValueName
Else
strDescricao = Err.Description
strErroNumero = Err.Number
oTextOutput.writeLine
oTextOutput.writeLine (strComputer & ";" & "Erro nº:" & strErroNumero & ";" & strDescricao & ";" & Now)
End If
'Deleta pastas e subpastas SoftwareDistribution
If Err.Number = 0 Then
Set colSubfolders = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")
ReDim Preserve arrFolders(intSize)
arrFolders(intSize) = strFolderName
intSize = intSize + 1
For Each objFolder In colSubfolders
GetSubFolders strFolderName
Next
For i = UBound(arrFolders) To 0 Step -1
strFolder = arrFolders(i)
strFolder = Replace(strFolder, "\", "\\")
Set colFolders = objWMIService.ExecQuery _
("Select * from Win32_Directory where Name = '" & strFolder & "'")
For Each objFolder In colFolders
strCaminho = objFolder.Name
errResults = objFolder.Delete
Next
oTextOutput.writeLine (strComputer & ";" & "Pastas apagadas com sucesso: " & strCaminho & ";" & Now)
Next
'Para o serviço do registro remoto-----------------------------------------
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='RemoteRegistry'")
For Each objService in colServiceList
errReturn = objService.Change (, , , , "Desativado")
errReturn = objService.StopService()
Next
'Inicia o serviço do Windows update --------------------------------------
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='wuauserv'")
For Each objService In colServiceList
errReturn = objService.StartService()
oTextOutput.writeLine (strComputer & ";" & "Serviço iniciado com sucesso " & ";" & Now)
Next
End If
'Verifica se o serviço já está em execução -------------------------------
If Err.Number = 0 Then
strdata1 = formatDateTime(now,shorttime)
SS = 0
While SS = 0
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='wuauserv'")
For Each objService In colServiceList
statusS = objService.State
Next
If statusS = "Running" Then
SS = 1
End If
strData2 = formatDateTime(now,shorttime)
strResult = datediff("s",strdata1,strData2)
if strresult= 120 then
SS=1
end if
Wend
End If
'Força a erificação por novas atualizações --------------------------------------
If Err.Number = 0 Then
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
If strOSType = "Microsoft Windows XP Professional" Then
Error = objWMIService.Create("C:\WINDOWS\System32\wuauclt.exe /resetauthorization /detectnow", Null, Null, intProcessID)
If Error = 0 Then
oTextOutput.writeLine (strComputer & ";" & "Novo update iniciado")
Else
oTextOutput.writeLine (strComputer & ";" & "Falha ao forçar o Windows Update")
End If
Else
If strOSType = "Microsoft Windows 2000 Professional" Then
Error = objWMIService.Create("C:\WINnt\System32\wuauclt.exe /resetauthorization /detectnow", Null, Null, intProcessID)
If Error = 0 Then
oTextOutput.writeLine (strComputer & ";" & "Novo update iniciado ")
Else
oTextOutput.writeLine (strComputer & ";" & "Falha ao forçar o Windows Update")
End If
End If
End If
End If
strOSType = ""
strComputer = ""
objFolder = ""
Loop
Sub GetSubFolders(strFolderName)
Set colSubfolders2 = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")
For Each objFolder2 In colSubfolders2
strFolderName = objFolder2.Name
ReDim Preserve arrFolders(intSize)
arrFolders(intSize) = strFolderName
intSize = intSize + 1
GetSubFolders strFolderName
Next
End Sub
WScript.Echo ("Fim")
'*** Fim do código*************************************

Postar um comentário