Finally the help of IT is here

Blog de soluciones informaticas.

Como resolver problema ID duplicado en clientes WSUS

Escrito por Xavier Xaus Nadal on marzo 21st, 2010

Buenas.

En muchas ocasiones dentro un entorno corporativo en el que disponemos de una gran cantidad de equipos montados a partir de clones nos encontramos que existen ID’s de programas duplicados como por ejemplo el del agente de antivirus o incluso el del cliente de WSUS.

En este artículo os muestro como solucionar un problema que provoca que no todos los equipos del dominio a los que hemos incluido en el servidor WSUS sean mostrados correctamente. Esto puede ser debido a que varios equipos tienen el mismo ID de cliente WSUS provocando que en ocasiones aparezca únicamente un equipo de cada 10 por culpa de esta duplicidad de ID.

Recopilando información encontramos este artículo que nos ayudó mucho.

http://www.eggheadcafe.com/forumarchives/windowsserverupdate_services/jul2005/post23508663.asp

En él aparece un script creado por Torgeir Bakken un MVP Scripting and WMI noruego que muestra una parte de como solventar este problema.

Lo hemos adaptado y mejorado un poquillo y el resultado es este:

On Error Resume Next
Err.Clear

Const OpenAsASCII      =  0
Const OverwriteIfExist = -1
Const ForAppending = 8

Set oShell = CreateObject(«WScript.Shell»)
Set oFSO = CreateObject(«Scripting.FileSystemObject»)
Set oWshNetwork = CreateObject(«WScript.Network»)

sFolderPath = «Z:»
sLogFilePath = sFolderPath & «\_ClientIdResetLog.txt»
sRegKey = «HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate»
sIDChecked = oShell.RegRead(sRegKey & «\ClientSusIdChecked»)

If sIDChecked <> «yes» Then

    For i = 0 To 90
        oWshNetwork.MapNetworkDrive «Z:»,»\\<servidor>\<carpeta compartida>«,,»<usuario>«,»<contraseña>»
        If Err.Number <> 0 Then
            WScript.Sleep 1000
        Else
            Exit for
        End If
    Next

    SusClientId = «»
    sSusClientId = oShell.RegRead(sRegKey & «\SusClientId»)
    If sSusClientId <> «» And oFSO.FolderExists(sFolderPath) Then

        sFilePath = sFolderPath & «\» & sSusClientId & «.txt»
        If oFSO.FileExists(sFilePath) Then

            oShell.RegDelete sRegKey & «\AccountDomainSid»
              oShell.RegDelete sRegKey & «\PingID»
            oShell.RegDelete sRegKey & «\SusClientId»
            oShell.Run «%SystemRoot%\system32\net.exe stop wuauserv», 0, True
            oShell.Run «%SystemRoot%\system32\net.exe start wuauserv», 0, True

            sCmd = _
            «%SystemRoot%\system32\wuauclt.exe /resetauthorization /detectnow»
            oShell.Run sCmd, 0, True
            fSusClientId = oShell.RegRead(sRegKey & «\SusClientId»)
            fFilePath = sFolderPath & «\» & fSusClientId & «.txt»

            Set f = oFSO.CreateTextFile(fFilePath, OverwriteIfExist, OpenAsASCII)
            f.WriteLine oWshNetwork.ComputerName
            f.Close
            bUpdLogFinished = False
            iLoops = 0

            Do
                Err.Clear
                Set fLogFile = oFSO.OpenTextFile(sLogFilePath, ForAppending, True)
                If Err.Number <> 0 Then
                    WScript.Sleep 500
                Else
                    fLogFile.WriteLine Now & «, » & oWshNetwork.ComputerName
                    fLogFile.Close
                    bUpdLogFinished = True
                End If
                iLoops = iLoops + 1
            Loop Until bUpdLogFinished Or iLoops > 10

        Else
             Set f = oFSO.CreateTextFile(sFilePath, OverwriteIfExist, OpenAsASCII)
            f.WriteLine oWshNetwork.ComputerName
            f.Close

        End If

    oShell.RegWrite sRegKey & «\ClientSusIdChecked», «yes»
    End If
    oWshNetwork.RemoveNetworkDrive «Z:», True     
End If

Este script se ejecutará antes de que el usuario arranque su sesión con el usuario SYSTEM (Usuario con mayores privilegios locales) ya que de no ser así si el usuario no es administrador local no podríamos modificar las claves del registro a nuestro antojo. Hemos modificado el script para que mapee una unidad con un usuario de dominio que tenga permisos sobre la carpeta destino, ya que el usuario SYSTEM únicamente tiene acceso localmente No a una carpeta de red.

Os explico a grandes rasgos
que hace este script.

1.- Lee la entrada del registro ClientSusIdChecked de cada PC que ejecute el script comprobando que sea distinta de yes. (Así hacemos que este script se ejecute una única vez completamente).

2.- Si es distinta de yes entonces mapea una unidad con un usuario de dominio para poder guardar un fichero con el nombre del ID de WSUS que más tarde usaremos.

3.- Lee la entrada del registro SusClientId recogiendo el valor y si es distinto de “” y hemos mapeado correctamente la unidad entonces guardará el fichero en la ruta mapeada con el nombre del ID de WSUS.txt en el caso que el fichero no exista ya.

4.- Si el fichero existe entonces eliminará las claves del registro y generará unas nuevas con un nuevo ID almacenando en el fichero _ClientidResetLog.txt el equipo al que hemos reseteado el ID (Para tener un control de los equipos que tenían el ID duplicado) y generando un nuevo fichero con el nuevo ID.

5.- Finalmente desmapea la unidad donde se almacenan estos logs y escribe en la cadena del registro ClientSusIdChecked un yes.

Con todo esto conseguimos un repositorio de los ID de WSUS de cada equipo del dominio y a su vez que ninguno sea igual.

Como usar este script?:

Abrir un notepad y copiad y pegad el texto del script.

Modificad los campos que os he puesto en negrita que están entre <> ya que será la ruta y el usuario y password que usaremos para poder grabar los ficheros con los ID de cliente WSUS.

<servidor>\<carpeta compartida>

<usuario>

<contraseña>

Guardadlo como AutomatedSusId.vbs en \netlogon\AutomatedSusId.vbs»>\netlogon\AutomatedSusId.vbs»>\netlogon\AutomatedSusId.vbs»>\\<dominio>\netlogon\AutomatedSusId.vbs antes del inicio de sesión del usuario.

Nos vamos a un controlador de dominio.

Inicio –> Ejecutar –> escribimos gpmc.msc

Por ejemplo podríamos modificar la política Default Domain Policy para que todos los equipos del dominio ejecutaran este script, pero no me gusta tocar esta política así que os recomiendo crear una nueva y aplicarla únicamente a la unidad organizativa donde tengáis los equipos.

WsusClientID_1

Pulsad sobre Crear y vincular un GPO aquí en la OU donde tengáis ubicados los equipos.

WsusClientID_2

Le ponemos un nombre y pulsamos sobre Aceptar.

Pulsad con el botón derecho sobre Editar.

WsusClientID_3

En Configuración del Equipo –> Configuracion de Windows –> Archivos de comandos (Inicio/Apagado) pulsamos doble click sobre Inicio.

WsusClientID_4

Pulsamos sobre Agregar.

WsusClientID_5

En el campo Nombre del archivo de comandos: escribimos la ruta donde hemos almacenado el script y pulsamos sobre Aceptar y Aceptar de nuevo.

Ahora cuando los equipos reinicien se generarán los ficheros en la ruta que hemos dispuesto para el almacenaje de los logs y podremos comprobar como se autogeneran sin el id está duplicado y veremos también cada ID de cada cliente.

Esto es todo por hoy. Espero que os sea de utilidad.

PD: Existen otras formas de solucionar este problema pero no tan eficaces como el que os he mostrado.

http://blogs.technet.com/sus/archive/2009/05/05/resolving-the-duplicate-susclientid-issue-or-why-don-t-all-my-clients-show-up-in-the-wsus-console.aspx

http://joeelway.spaces.live.com/blog/cns!2095EAC3772C41DB!1930.entry

Saludos y hasta pronto MegaCracks.

Related Posts Plugin for WordPress, Blogger...
Etiquetas: , , , , , ,


Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>