El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script VBScript Para Cambiar La Configuración DNS De Varios Equipos (2)

Posted by urpiano en Sábado 17 \17\UTC mayo \17\UTC 2008

Basado en mi anterior script cambiar-dns.vbs, este script permite eliminar los servidores DNS y establecer otros nuevos en varios equipos de forma remota. Utiliza WMI para realizar esta tarea. Se diferencia de cambiar-dns.vbs en que en este script se debe especificar el nombre de la conexión de red a la que se cambiará la configuración de DNS (el anterior lo hacía para toda conexión que tuviese habilitada la configuración IP). Dado que se utiliza el operador LIKE en la consulta WQL, y que se controla que la conexión tenga nombre, se podría hacer para toda conexión pasando como nombre el tanto por ciento (%)

Sintaxis

cscript [//nologo] cambiar-dns-a-conexion.vbs /L:listaDNS [/E:lista] [/F:fichero] [/O:fichero] [/U:usuario] [/C:contraseña] [/?] conexión

Siendo

Etiqueta Dato ¿Requerido? Descripción
  conexión
Nombre de la conexión de red a la que se debe cambiar la configuración DNS. Si contiene espacios, se debe encerrar entre comillas.
L listaDNS
Lista de servidores DNS, separados por coma, que se han de configurar. El orden en el que aparecen de izquierda a derecha es el orden que tendrán como servidores DNS.
E lista No
Nombres de los equipos, separados por comas, a los que se cambiarán los DNSs. Si no se recibe este argumento ni el argumento /F (fichero de texto con los nombres de equipos, uno por línea), se producirá un error y se terminará la ejecución del script. En el caso de que se pasen ambos argumentos, prevalecerá el argumento /F.
F fichero No
Ruta y nombre de un fichero de texto con los nombres de los equipos a los que se cambiará los DNSs. Si no se recibe este argumento ni el argumento /E (lista de los equipos separados por comas), se producirá un error y se terminará la ejecución del script. En el caso de que se pasen ambos argumentos, prevalecerá el argumento /F.
O fichero No
Ruta y nombre de un fichero al que se volcarán los resultados obtenidos. Se trata de un fichero de valores separados por tabuladores, ideal para ser abierto con Excel.
U usuario No
Nombre del usuario con el que se conectará al servicio WMI. Si el equipo local está incluído en la lista de los equipos, no se conectará con este usuario, si no con el usuario que lanza el script, pues no se puede conectar a WMI con credenciales alternativas en el equipo local.
C contraseña No
Contraseña del usuario de conexión. Este argumento será ignorado si no se pasa el argumento /U. En caso de ser pasado el argumento /U y no ser pasado este argumento, el script presentará una ventana de Internet Explorer en el que se pedirá al usuario que escriba la contraseña en una caja de texto de tipo password.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Establece “192.168.0.200,192.168.0.201,192.168.0.202” como servidores DNS, de la conexión de red “”Conexión de área local””, en los equipos “gandalf,pippin,frodo”:

cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /E:gandalf,pippin,frodo "Conexión de área local"

– Establece “192.168.0.200,192.168.0.201,192.168.0.202” como servidores DNS, de la conexión de red “”Conexión de área local””, en los equipos contenidos en el fichero “c:gondorequipos.txt”:

cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c:gondorequipos.txt "Conexión de área local"

– Establece “192.168.0.200,192.168.0.201,192.168.0.202” como servidores DNS, de la conexión de red “”Conexión de área local””, en los equipos contenidos en el fichero “c:gondorequipos.txt”, conectando a WMI como el usuario “gondoradministrator”:

cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c:gondorequipos.txt
/U:gondoradministrator "Conexión de área local"

– Establece “192.168.0.200,192.168.0.201,192.168.0.202” como servidores DNS, de la conexión de red “”Conexión de área local””, en los equipos contenidos en el fichero “c:gondorequipos.txt”, conectando a WMI como el usuario “gondoradministrator”, suministrando como contraseña de conexión “”Nunca la sabrás””:

cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c:gondorequipos.txt
/U:gondoradministrator
/C:"Nunca la sabrás" "Conexión de área local"

– Establece “192.168.0.200,192.168.0.201,192.168.0.202” como servidores DNS, de la conexión de red “”Conexión de área local””, en los equipos contenidos en el fichero “c:gondorequipos.txt”, conectando a WMI como el usuario “gondoradministrator”, suministrando como contraseña de conexión “”Nunca la sabrás””. En lugar de mostrarse por pantalla, los resultados se almacenarán en el archivo “e:gondorcambio-dns.txt”:

cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c:gondorequipos.txt /O:e:gondorcambio-dns.txt /U:gondoradministrator /C:"Nunca la sabrás" "Conexión de área local"

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* cambiar-dns-a-conexion.vbs                                          *
'*                                                                     *
'* Basado en mi anterior script cambiar-dns.vbs, este script permite   *
'* eliminar los servidores DNS y establecer otros nuevos en varios     *
'* equipos de forma remota. Utiliza WMI para realizar esta tarea. Se   *
'* diferencia de                                                       *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] cambiar-dns-a-conexion.vbs /L:listaDNS           *
'* [/E:lista] [/F:fichero] [/O:fichero] [/U:usuario] [/C:contraseña]   *
'* [/?] conexión                                                       *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - conexión (Requerido):                                             *
'*         Nombre de la conexión de red a la que se debe cambiar la    *
'*         configuración DNS. Si contiene espacios, se debe encerrar   *
'*         entre comillas.                                             *
'*                                                                     *
'* - /L: listaDNS (Requerido):                                         *
'*         Lista de servidores DNS, separados por coma, que se han de  *
'*         configurar. El orden en el que aparecen de izquierda a      *
'*         derecha es el orden que tendrán como servidores DNS.        *
'*                                                                     *
'* - /E: lista (Opcional):                                             *
'*         Nombres de los equipos, separados por comas, a los que se   *
'*         cambiarán los DNSs. Si no se recibe este argumento ni el    *
'*         argumento /F (fichero de texto con los nombres de equipos,  *
'*         uno por línea), se producirá un error y se terminará la     *
'*         ejecución del script. En el caso de que se pasen ambos      *
'*         argumentos, prevalecerá el argumento /F.                    *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         Ruta y nombre de un fichero de texto con los nombres de los *
'*         equipos a los que se cambiará los DNSs. Si no se recibe     *
'*         este argumento ni el argumento /E (lista de los equipos     *
'*         separados por comas), se producirá un error y se terminará  *
'*         la ejecución del script. En el caso de que se pasen ambos   *
'*         argumentos, prevalecerá el argumento /F.                    *
'*                                                                     *
'* - /O: fichero (Opcional):                                           *
'*         Ruta y nombre de un fichero al que se volcarán los          *
'*         resultados obtenidos. Se trata de un fichero de valores     *
'*         separados por tabuladores, ideal para ser abierto con Excel.*
'*                                                                     *
'* - /U: usuario (Opcional):                                           *
'*         Nombre del usuario con el que se conectará al servicio WMI. *
'*         Si el equipo local está incluído en la lista de los         *
'*         equipos, no se conectará con este usuario, si no con el     *
'*         usuario que lanza el script, pues no se puede conectar a    *
'*         WMI con credenciales alternativas en el equipo local.       *
'*                                                                     *
'* - /C: contraseña (Opcional):                                        *
'*         Contraseña del usuario de conexión. Este argumento será     *
'*         ignorado si no se pasa el argumento /U. En caso de ser      *
'*         pasado el argumento /U y no ser pasado este argumento, el   *
'*         script presentará una ventana de Internet Explorer en el    *
'*         que se pedirá al usuario que escriba la contraseña en una   *
'*         caja de texto de tipo password.                             *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Establece "192.168.0.200,192.168.0.201,192.168.0.202" como        *
'* servidores DNS, de la conexión de red "Conexión de área local",     *
'* en los equipos "gandalf,pippin,frodo":                              *
'*                                                                     *
'* cscript //nologo cambiar-dns-a-conexion.vbs                         *
'* /L:192.168.0.200,192.168.0.201,192.168.0.202                        *
'* /E:gandalf,pippin,frodo "Conexión de área local"                    *
'*                                                                     *
'* - Establece "192.168.0.200,192.168.0.201,192.168.0.202" como        *
'* servidores DNS, de la conexión de red "Conexión de área local",     *
'* en los equipos contenidos en el fichero "c:gondorequipos.txt":    *
'*                                                                     *
'* cscript //nologo cambiar-dns-a-conexion.vbs                         *
'* /L:192.168.0.200,192.168.0.201,192.168.0.202                        *
'* /F:c:gondorequipos.txt "Conexión de área local"                   *
'*                                                                     *
'* - Establece "192.168.0.200,192.168.0.201,192.168.0.202" como        *
'* servidores DNS, de la conexión de red "Conexión de área local",     *
'* en los equipos contenidos en el fichero "c:gondorequipos.txt",    *
'* conectando a WMI como el usuario "gondoradministrator":            *
'*                                                                     *
'* cscript //nologo cambiar-dns-a-conexion.vbs                         *
'* /L:192.168.0.200,192.168.0.201,192.168.0.202                        *
'* /F:c:gondorequipos.txt /U:gondoradministrator "Conexión de área  *
'* local"                                                              *
'*                                                                     *
'* - Establece "192.168.0.200,192.168.0.201,192.168.0.202" como        *
'* servidores DNS, de la conexión de red "Conexión de área local",     *
'* en los equipos contenidos en el fichero "c:gondorequipos.txt",    *
'* conectando a WMI como el usuario "gondoradministrator",            *
'* suministrando como contraseña de conexión ""Nunca la sabrás"":      *
'*                                                                     *
'* cscript //nologo cambiar-dns-a-conexion.vbs                         *
'* /L:192.168.0.200,192.168.0.201,192.168.0.202                        *
'* /F:c:gondorequipos.txt /U:gondoradministrator /C:"Nunca la       *
'* sabrás" "Conexión de área local"                                    *
'*                                                                     *
'* - Establece "192.168.0.200,192.168.0.201,192.168.0.202" como        *
'* servidores DNS, de la conexión de red "Conexión de área local",     *
'* en los equipos contenidos en el fichero "c:gondorequipos.txt",    *
'* conectando a WMI como el usuario "gondoradministrator",            *
'* suministrando como contraseña de conexión ""Nunca la sabrás"". En   *
'* lugar de mostrarse por pantalla, los resultados se almacenarán en   *
'* el archivo "e:gondorcambio-dns.txt":                              *
'*                                                                     *
'* cscript //nologo cambiar-dns-a-conexion.vbs                         *
'* /L:192.168.0.200,192.168.0.201,192.168.0.202                        *
'* /F:c:gondorequipos.txt /O:e:gondorcambio-dns.txt                *
'* /U:gondoradministrator /C:"Nunca la sabrás" "Conexión de área      *
'* local"                                                              *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Mayo De 2008                                                        *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error      'As String
Dim int_Error      'As String
Dim str_Conexion   'As String
Dim arr_st_DNS     'As String
Dim arr_st_Equipos 'As String
Dim str_TXT        'As String
Dim str_Mensaje    'As String
Dim str_Usuario    'As String
Dim str_Clave      'As String
Dim int_Equipo     'As Integer

Dim obj_FS         'As Scripting.FileSystemObject
Dim obj_TS         'As Scripting.TextStream


'Validando los argumentos y almacenando
'sus valores
If f_RevisarArgumentos( _
                       str_Error, _
                       int_Error) Then

    Call s_Ayuda(str_Error)
    WScript.Quit int_Error

End If

'Empezamos el mensaje de salida con el encabezado
str_Mensaje = "Equipo" & vbTab & _
              "Nº Configuración" & vbTab & _
              "Servidores Antes" & vbTab & _
              "¿Se Cambió?" & vbTab & _
              "Servidores Después" & vbCrLf

'Recorremos ahora todos los equipos a procesar
For int_Equipo = LBound(arr_st_Equipos) To UBound(arr_st_Equipos)

    'Si ha fallado el procesamiento del equipo actual...
    If Not f_ProcesarEquipo(arr_st_Equipos(int_Equipo)) Then

        'lo indicamos así en el mensaje
        str_Mensaje = str_Mensaje & arr_st_Equipos(int_Equipo) & _
                      vbTab & "Falló en el procesamiento" & _
                      vbCrLf & vbCrLf

    End If

    'Como no se ha recibido el parámetro O (fichero de
    'salida), mostramos el resultado por pantalla y vaciamos
    'la variable del mensaje
    If Len(str_TXT) = 0 Then 

        WScript.Echo str_Mensaje
        str_Mensaje = ""

    'Como hay volcar la información en un fichero, añadimos
    'un salto de línea, preparando el mensaje para el siguiente
    'equipo
    Else

        str_Mensaje = str_Mensaje & vbCrLf

    End If

Next 'int_Equipo

'Si hay que volcar información en el fichero
'de salida de ruta y nombre str_TXT
If Len(str_TXT) > 0 Then

    'Creamos un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")

    'Creamos el fichero de salida
    Set obj_TS = obj_FS.CreateTextFile(str_TXT)

    'Volcamos la información de salida en el fichero
    obj_TS.Write str_Mensaje

    'Cerramos el fichero de salida
    obj_TS.Close

    'Limpieza de popa :-)
    Set obj_TS = Nothing
    Set obj_FS = Nothing

End If

Function f_ProcesarEquipo(str_Equipo) 'As Boolean
'***********************************************************************
'* Procedimiento: f_ProcesarEquipo                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 19/07/2007 12:25:05                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función permite cambiar los DNSs del equipo     *
'*                recibido como parámetro. En caso de tener éxito,     *
'*                devuelve True, en caso contrario False. Para hacer   *
'*                esto, utiliza el método SetDNSServerSearchOrder del  *
'*                objeto Win32_NetworkAdapterConfiguration de WMI.     *
'*                Está basada en el script Dns-replaceserverlist.vbs   *
'*                del artículo:                                        *
'*http://www.microsoft.com/technet/scriptcenter/topics/networking/05_a *
'*tnc_dns.mspx                                                         *
'***********************************************************************

    Dim bol_Devolucion  'As Boolean
    Dim obj_ServicioWMI 'As SWbemScripting.SWbemServices
    Dim obj_ConfiguracionNIC 'As WMIClasses. _
                       'Win32_NetworkAdapterConfiguration
    Dim col_ConfiguracionNICs 'As WMIClasses. _
            'Win32_NetworkAdapterConfiguration collection
    Dim col_NICs 'As WMIClasses.Win32_NetworkAdapter collection
    Dim obj_NIC 'As WMIClasses.Win32_NetworkAdapter
    Dim str_ServidoresDNS 'As String
    Dim int_Devolucion 'As Integer
    Dim bol_PrimeroMostrado 'As Boolean
    Dim arr_SiguientesAntes() 'As String
    Dim arr_SiguientesDespues() 'As String
    Dim int_SiguienteAntes 'As Integer
    Dim int_SiguienteDespues 'As Integer
    Dim int_Siguiente 'As Integer
    Dim str_Siguientes 'As Integer
    Dim int_Ciclos 'As Integer
    Dim str_Etiqueta 'As String

    'Miramos si el equipo responde al ping
    If Not f_EquipoResponde(str_Equipo) _
    And Not str_Equipo = "." Then
    
        'El equipo no responde, así lo indicamos en
        'el mensaje y salimos de la función devolviendo
        'False
        str_Mensaje = str_Mensaje & _
                      str_Equipo & vbTab & _
                      "No responde a PING" & vbCrLf
    
        f_ProcesarEquipo = False
        Exit Function
        
    End If
    
    
    'Conectamos con el servicio WMI del equipo
    If Not f_ServicioWMI(obj_ServicioWMI, _
                         str_Usuario, _
                         str_Clave, _
                         str_Equipo,_
                         "rootCIMV2") Then

        'No se ha podido conectar, lo indicamos y salimos de la´
        'función devolviendo False
        str_Mensaje = str_Mensaje & _
                      str_Equipo & vbTab & _
                      "No se pudo conectar a WMI" & vbCrLf

        f_ProcesarEquipo = False
        Exit Function

    End If

    'Establecemos control de errores
'    On Error Resume Next

    'Hacemos la consulta de los adaptadores de red que cumplan con
    'el patrón de nombre de conexión a la que están asociados
    Set col_NICs = obj_ServicioWMI.ExecQuery _
     ("SELECT " & _
              "* " & _
      "FROM " & _
              "Win32_NetworkAdapter " & _
      "WHERE " & _
              "NetConnectionID LIKE '" & str_Conexion & "'")
              
    'Recorremos los adaptadores encontrados
    For Each obj_NIC In col_NICs

        'Solo nos interesan los adaptadores de red que estén asociados
        'a una conexión de red
        If Len(obj_NIC.NetConnectionID) > 0 Then

          'Obtenemos la etiqueta del adaptador, la cual nos valdrá
          'para localizaqr su configuración, ya que coinciden en
          'los objetos Win32_NetworkAdapter y 
          'Win32_NetworkAdapterConfiguration
          str_Etiqueta = obj_NIC.Caption
            
          Set col_ConfiguracionNICs = obj_ServicioWMI.ExecQuery _
           ("SELECT " & _
                    "* " & _
            "FROM " & _
                    "Win32_NetworkAdapterConfiguration " & _
            "WHERE " & _
                    "Caption = '" & str_Etiqueta & "'")

          For Each obj_ConfiguracionNIC In col_ConfiguracionNICs
            
           'Ponemos el nombre del equipo en el mensaje
            str_Mensaje = str_Mensaje & str_Equipo
      
            'Ponemos el número de índice de la configuración
            'del adaptador
            str_Mensaje = str_Mensaje & vbTab & _
                          obj_ConfiguracionNIC.Index & vbTab
        
            'Vamos ahora a poner la configuración DNS que tiene el
            'adaptador
            If Not IsNull(obj_ConfiguracionNIC.DNSServerSearchOrder) _
            Then
        
              'Recorremos los diferentes servidores configurados
              For Each str_ServidoresDNS In _
                        obj_ConfiguracionNIC.DNSServerSearchOrder
        
                  'Si no es el primero..
                  If bol_PrimeroMostrado Then
        
                    'Tenemos que volcar su información en otra
                    'línea: creamos un elemento en el array con
                    'el que montaremos la nueva línea
                    ReDim Preserve arr_SiguientesAntes( _
                                              int_SiguienteAntes)
      
                    'Volcamos el servidor en el elemento creado
                    arr_SiguientesAntes(int_SiguienteAntes) = _
                                                str_ServidoresDNS
      
                    'Incrementamos el contador de líneas
                    int_SiguienteAntes = int_SiguienteAntes + 1
        
                  Else
        
                    'Marcamos que ya hemos mostrado el primer
                    'servidor
                    bol_PrimeroMostrado = True
        
                    'Ponemos el servidor en el mensaje
                    str_Mensaje = str_Mensaje & str_ServidoresDNS
        
                  End If
        
                Next
        
                'Reiniciamos el marcador de primero ya encontrado
                'para la siguiente vuelta
                bol_PrimeroMostrado = False
        
              End If
        
              'Procedemos a cambiar la configuración DNS
              int_Devolucion = _
                  obj_ConfiguracionNIC.SetDNSServerSearchOrder( _
                                                       arr_st_DNS)
        
              'Si la devolución es correcta...
              If int_Devolucion = 0 Then
        
                'Marcamos en el mensaje que ha sido cambiado
                str_Mensaje = str_Mensaje & vbTab & "Sí"
      
              'Si no ha sido correcta...
              Else
       
                'Marcamos que no se ha podido cambiar
                str_Mensaje = str_Mensaje & vbTab & "No"
        
              End If
                
            Next 'obj_ConfiguracionNIC
    
        End If
        
    Next 'obj_NIC

    'Hacemos un bucle idéntico al anterior, para obtener los nuevos
    'servidores configurados
    Set col_NICs = obj_ServicioWMI.ExecQuery _
     ("SELECT " & _
              "* " & _
      "FROM " & _
              "Win32_NetworkAdapter " & _
      "WHERE " & _
              "NetConnectionID LIKE '" & str_Conexion & "'")
              
    'Recorremos los adaptadores encontrados
    For Each obj_NIC In col_NICs

        'Solo nos interesan los adaptadores de red que estén asociados
        'a una conexión de red
        If Len(obj_NIC.NetConnectionID) > 0 Then

            'Obtenemos la etiqueta del adaptador, la cual nos valdrá
            'para localizaqr su configuración, ya que coinciden en
            'los objetos Win32_NetworkAdapter y 
            'Win32_NetworkAdapterConfiguration
            str_Etiqueta = obj_NIC.Caption
            
            Set col_ConfiguracionNICs = obj_ServicioWMI.ExecQuery _
             ("SELECT " & _
                      "* " & _
              "FROM " & _
                      "Win32_NetworkAdapterConfiguration " & _
              "WHERE " & _
                      "Caption = '" & str_Etiqueta & "'")

            For Each obj_ConfiguracionNIC In col_ConfiguracionNICs
            
              'Solo nos interesan los adaptadores de red que asociados
              'a una conexión de red
'              If Len(obj_ConfiguracionNIC.NetConnectionID) > 0 Then
      
                If Not IsNull(obj_ConfiguracionNIC.DNSServerSearchOrder) _
                Then
        
                  For Each str_ServidoresDNS In _
                            obj_ConfiguracionNIC.DNSServerSearchOrder
          
                    'Al igual que hicimos antes, debemos volcar en
                    'una nueva línea cada uno de los que haya por
                    'encima del primero. Esta vez lo hacemos en el
                    'array de siguientes de después
                    If bol_PrimeroMostrado Then
            
                      ReDim Preserve arr_SiguientesDespues( _
                                              int_SiguienteDespues)
                       arr_SiguientesDespues(int_SiguienteDespues) = _
                                                str_ServidoresDNS
                       int_SiguienteDespues = _
                                          int_SiguienteDespues + 1
            
                    Else
            
                      bol_PrimeroMostrado = True
                      str_Mensaje = str_Mensaje & vbTab & _
                                          str_ServidoresDNS
            
                    End If
            
                  Next
                         
                End If
            
'              End If
                    
            Next 'obj_ConfiguracionNIC
            
        End If    
        
    Next 'obj_NIC
    
    'Quitamos zurraspas :-))
    Set obj_ConfiguracionNIC = Nothing
    Set col_ConfiguracionNICs = Nothing
    Set obj_NIC = Nothing
    Set col_NICs = Nothing

    'Si tenemos anteriores o siguientes,procederemos a volcar la
    'información en el mensaje. Eso lo haremos en un bucle FOR.
    'En este If obtendremos cuál es el límite superior hasta el
    'que debe llegar el bucle (el inferior siempre será 0)
    If int_SiguienteAntes >= int_SiguienteDespues _
    And int_SiguienteAntes > 0 Then

        'El límite del array de antes es superior o igual al
        'de después y superior a cero; de esta manera
        'evitamos que se pueda intentar recorrer arrays vacíos,
        'lo que provoca un error (si hay un primer elemento el
        'valor del contador es 1)
        int_Ciclos = int_SiguienteAntes

    ElseIf int_SiguienteDespues > 0 Then

        'El límite de después es el superior y es mayor
        'que cero
        int_Ciclos = int_SiguienteDespues

    End If

    'Si hay al menos uin elemento en algún array
    If int_Ciclos >= 0 Then

        For int_Siguiente = 0 To int_Ciclos - 1

            'Si existe el elemento en el array de antes...
            If int_Siguiente <= int_SiguienteAntes -1 Then

                'lo volcamos en la nueva línea
                str_Siguientes = str_Siguientes & _
                                    String(2,vbTab) & _
                                    arr_SiguientesAntes(_
                                            int_Siguiente)

            'si no lo lo hay...
            Else

                'lo dejamos vacío
                str_Siguientes = str_Siguientes & _
                                    String(3,vbTab)

            End If

            'Si existe el elemento en el array de después...
            If int_Siguiente <= int_SiguienteDespues -1 Then

                'Lo volcamos en la nueva línea
                str_Siguientes = str_Siguientes & _
                                    String(2,vbTab) & _
                                    arr_SiguientesDespues(_
                                            int_Siguiente) & _
                                    vbCrLf

            'si no lo lo hay...
            Else

                'lo dejamos vacío
                str_Siguientes = str_Siguientes & _
                                    String(2,vbTab) & vbCrLf

            End If

        Next 'int_Siguiente

        'Quitamos el salto de línea final
        If Len(str_Siguientes) > 0 Then _
            str_Siguientes = Left(str_Siguientes, _
                                  Len(str_Siguientes)-2)
        'Añadimos los DNS siguientes al mensaje
        str_Mensaje = str_Mensaje & vbCrLf & str_Siguientes

    End If

    'Si hemos llegado hasta aquí, todo ha sido correcto, y
    'así lo reflejamos en la devolución
    f_ProcesarEquipo = True

    Set obj_ServicioWMI = Nothing

End Function 'f_ProcesarEquipo

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 17/10/2007 10:38:42                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función revisa los argumentos recibidos,        *
'*                recogiendo los posibles fallos por falta de          *
'*                argumentos requeridos y almacenando en las           *
'*                variables correspondientes los argumentos            *
'*                recibidos. recibe dos parámetros cuyo fin es ser de  *
'*                salida: una cadena que almacenará los errores        *
'*                detectados y un entero que almacenará el código de   *
'*                los errores detectados. Hay tres tipos de error;     *
'*                error 1 para los argumentos sin nombre requeridos y  *
'*                no encontrados, error 2 para los argumentos con      *
'*                nombre requeridos y no encontrados, por último,      *
'*                error 4 para los combos de argumentos opcionales     *
'*                (un combo de argumentos opcionales es aquel          *
'*                conjunto de argumentos opcionales que es requerido   *
'*                que se pase al menos uno de ellos y que si se pasa   *
'*                más de uno se ignorarán aquellos que estén detrás    *
'*                en la prioridad entre ellos; una característica      *
'*                clara de lo que es un combo de argumentos es cuando  *
'*                dos omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1 'As Boolean
    Dim bol_Error2 'As Boolean
    Dim obj_FS 'As Scripting.FileSystemObject
    Const ForReading = 1
    Const TristateFalse = -1
    Dim obj_TS 'As Scripting.TextStream

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False


    'Si hay que mostrar la ayuda, se muestra y
    'termina el script
    If WScript.Arguments.Named.Exists("?") Then

        Call s_Ayuda("******************" & vbCrLf & _
                     "*     AYUDA      *" & vbCrLf & _
                     "******************")

        WScript.Quit 0

    End If

    'Revisamos si están todos los argumentos
    'sin nombre requeridos
    If WScript.Arguments.Unnamed.Count < 1 Then

        str_Error = "Error 1, falta/n argumento/s sin " & _
                    "nombre requerido/s"
        bol_Error1 = True

    Else

    'Guardamos los argumentos en las variables
    'correspondientes
        If _
          WScript.Arguments.Unnamed.Count - 1 _
          >= 0 Then _
               str_Conexion = _
                       WScript.Arguments.Unnamed(0)


    End If

    'Revisamos que esté el argumento requerido
    '/L (listaDNS)
    If WScript.Arguments.Named.Exists("L") Then

        arr_st_DNS =  _
               Split(WScript.Arguments.Named("L"),",")

    Else

        str_Error = str_Error & vbcrlf & _
                    "Error 2, falta argumento " & _
                    "requerido con nombre: " & _
                    "/L (listaDNS)"
        bol_Error2 = True

    End If

    'Revisamos si ha sido pasado el argumento
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then

        Set obj_FS = CreateObject("Scripting.FileSystemObject")
        Set obj_TS = obj_FS.OpenTextFile(WScript.Arguments.Named("F"))

        arr_st_Equipos = _
            Split(obj_TS.ReadAll,vbCrLf)

        obj_TS.Close
        Set obj_TS = Nothing
        Set obj_FS = Nothing

    'Revisamos si ha sido pasado el argumento
    '/E (lista)
    ElseIf WScript.Arguments.Named.Exists("E") Then

        arr_st_Equipos =  _
               Split(WScript.Arguments.Named("E"),",")

    Else

        str_Error = str_error & vbcrlf & _
                    "Error 4, no se ha pasado ninguno de los " & _
                    "argumentos integrantes de un combo: /E (" & _
                    "lista de equipos) y /F (Fichero con la l" & _
                    "ista de equipos)."
        int_Error = 4
        f_RevisarArgumentos = True
        Exit Function

    End If

    'Revisamos si ha sido pasado el argumento
    '/O (fichero)
    If WScript.Arguments.Named.Exists("O") Then

        str_TXT = WScript.Arguments.Named("O")

    End If

    'Revisamos si ha sido pasado el argumento
    '/U (usuario)
    If WScript.Arguments.Named.Exists("U") Then

        str_Usuario =  _
               WScript.Arguments.Named("U")

        'Revisamos si ha sido pasado el argumento
        '/C (contraseña)
        If WScript.Arguments.Named.Exists("C") Then

            str_Clave =  _
                   WScript.Arguments.Named("C")

        Else

            str_Clave = f_EntrarClave("\fernandor-fusuario-conexion")

        End If

    End If

    'Preparamos las variables de devolucion:
    'el entero como suma de los posibles errores 1 y 2
    int_Error = Abs(bol_Error1) + (2*Abs(bol_Error2))
    'La devolucion de la función será True en caso de
    'haber alguno de los errores
    bol_Devolucion = (bol_Error1 Or bol_Error2)

    'Hacemos la devolución de la función
    f_RevisarArgumentos = bol_Devolucion

End Function 'f_RevisarArgumentos

Sub s_Ayuda(str_Error)
'***********************************************************************
'* Procedimiento: s_Ayuda                                              *
'* Tipo         : Sub                                                  *
'* Devolución   :                                                      *
'* Fecha y Hora : 17/10/2007 10:38:42                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si viene      *
'*                será mostrado antes de la línea; pensado para que    *
'*                se muestre un error que se haya detectado.           *
'***********************************************************************

    'Si hay que mostrar algún texto previo a la ayuda, lo hacemos
    If Len(str_Error) > 0 Then

        WScript.Echo str_Error & vbCrLf & vbCrLf

    End If

    'A continuación, mostramos la ayuda por pantalla
    WScript.Echo "Basado en mi anterior script cambiar-dns.vbs, est" & _
                 "e script permite eliminar los"
    WScript.Echo "servidores DNS y establecer otros nuevos en vario" & _
                 "s equipos de forma remota."
    WScript.Echo "Utiliza WMI para realizar esta tarea. Se diferenc" & _
                 "ia de"
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] cambiar-dns-a-conexion.vbs /L:" & _
                 "listaDNS [/E:lista]"
    WScript.Echo "[/F:fichero] [/O:fichero] [/U:usuario] [/C:contra" & _
                 "seña] [/?] conexión"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- conexión (Requerido):"
    WScript.Echo "Nombre de la conexión de red a la que se debe cam" & _
                 "biar la"
    WScript.Echo "configuración DNS. Si contiene espacios, se debe " & _
                 "encerrar entre"
    WScript.Echo "comillas."
    WScript.Echo ""
    WScript.Echo "- /L: listaDNS (Requerido):"
    WScript.Echo "Lista de servidores DNS, separados por coma, que " & _
                 "se han de"
    WScript.Echo "configurar. El orden en el que aparecen de izquie" & _
                 "rda a derecha"
    WScript.Echo "es el orden que tendrán como servidores DNS."
    WScript.Echo ""
    WScript.Echo "- /E: lista (Opcional):"
    WScript.Echo "Nombres de los equipos, separados por comas, a lo" & _
                 "s que se"
    WScript.Echo "cambiarán los DNSs. Si no se recibe este argument" & _
                 "o ni el"
    WScript.Echo "argumento /F (fichero de texto con los nombres de" & _
                 " equipos, uno"
    WScript.Echo "por línea), se producirá un error y se terminará " & _
                 "la ejecución"
    WScript.Echo "del script. En el caso de que se pasen ambos argu" & _
                 "mentos,"
    WScript.Echo "prevalecerá el argumento /F."
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "Ruta y nombre de un fichero de texto con los nomb" & _
                 "res de los"
    WScript.Echo "equipos a los que se cambiará los DNSs. Si no se " & _
                 "recibe este"
    WScript.Echo "argumento ni el argumento /E (lista de los equipo" & _
                 "s separados"
    WScript.Echo "por comas), se producirá un error y se terminará " & _
                 "la ejecución"
    WScript.Echo "del script. En el caso de que se pasen ambos argu" & _
                 "mentos,"
    WScript.Echo "prevalecerá el argumento /F."
    WScript.Echo ""
    WScript.Echo "- /O: fichero (Opcional):"
    WScript.Echo "Ruta y nombre de un fichero al que se volcarán lo" & _
                 "s resultados"
    WScript.Echo "obtenidos. Se trata de un fichero de valores sepa" & _
                 "rados por"
    WScript.Echo "tabuladores, ideal para ser abierto con Excel."
    WScript.Echo ""
    WScript.Echo "- /U: usuario (Opcional):"
    WScript.Echo "Nombre del usuario con el que se conectará al ser" & _
                 "vicio WMI. Si"
    WScript.Echo "el equipo local está incluído en la lista de los " & _
                 "equipos, no se"
    WScript.Echo "conectará con este usuario, si no con el usuario " & _
                 "que lanza el"
    WScript.Echo "script, pues no se puede conectar a WMI con crede" & _
                 "nciales"
    WScript.Echo "alternativas en el equipo local."
    WScript.Echo ""
    WScript.Echo "- /C: contraseña (Opcional):"
    WScript.Echo "Contraseña del usuario de conexión. Este argument" & _
                 "o será"
    WScript.Echo "ignorado si no se pasa el argumento /U. En caso d" & _
                 "e ser pasado"
    WScript.Echo "el argumento /U y no ser pasado este argumento, e" & _
                 "l script"
    WScript.Echo "presentará una ventana de Internet Explorer en el" & _
                 " que se pedirá"
    WScript.Echo "al usuario que escriba la contraseña en una caja " & _
                 "de texto de"
    WScript.Echo "tipo password."
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Establece ""192.168.0.200,192.168.0.201,192.168" & _
                 ".0.202"" como servidores DNS, de"
    WScript.Echo "la conexión de red ""Conexión de área local""" & _
                 ", en los equipos"
    WScript.Echo """gandalf,pippin,frodo"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-dns-a-conexion.vbs"
    WScript.Echo "/L:192.168.0.200,192.168.0.201,192.168.0.202 /E:g" & _
                 "andalf,pippin,frodo ""Conexión"
    WScript.Echo "de área local"""
    WScript.Echo ""
    WScript.Echo "- Establece ""192.168.0.200,192.168.0.201,192.168" & _
                 ".0.202"" como servidores DNS, de"
    WScript.Echo "la conexión de red ""Conexión de área local""" & _
                 ", en los equipos contenidos en el"
    WScript.Echo "fichero ""c:gondorequipos.txt"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-dns-a-conexion.vbs"
    WScript.Echo "/L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c" & _
                 ":gondorequipos.txt ""Conexión"
    WScript.Echo "de área local"""
    WScript.Echo ""
    WScript.Echo "- Establece ""192.168.0.200,192.168.0.201,192.168" & _
                 ".0.202"" como servidores DNS, de"
    WScript.Echo "la conexión de red ""Conexión de área local""" & _
                 ", en los equipos contenidos en el"
    WScript.Echo "fichero ""c:gondorequipos.txt"", conectando a W" & _
                 "MI como el usuario"
    WScript.Echo """gondoradministrator"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-dns-a-conexion.vbs"
    WScript.Echo "/L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c" & _
                 ":gondorequipos.txt"
    WScript.Echo "/U:gondoradministrator ""Conexión de área local"""
    WScript.Echo ""
    WScript.Echo "- Establece ""192.168.0.200,192.168.0.201,192.168" & _
                 ".0.202"" como servidores DNS, de"
    WScript.Echo "la conexión de red ""Conexión de área local""" & _
                 ", en los equipos contenidos en el"
    WScript.Echo "fichero ""c:gondorequipos.txt"", conectando a W" & _
                 "MI como el usuario"
    WScript.Echo """gondoradministrator"", suministrando como cont" & _
                 "raseña de conexión """"Nunca la"
    WScript.Echo "sabrás"""":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-dns-a-conexion.vbs"
    WScript.Echo "/L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c" & _
                 ":gondorequipos.txt"
    WScript.Echo "/U:gondoradministrator /C:""Nunca la sabrás"" """ & _
                 "Conexión de área local"""
    WScript.Echo ""
    WScript.Echo "- Establece ""192.168.0.200,192.168.0.201,192.168" & _
                 ".0.202"" como servidores DNS, de"
    WScript.Echo "la conexión de red ""Conexión de área local""" & _
                 ", en los equipos contenidos en el"
    WScript.Echo "fichero ""c:gondorequipos.txt"", conectando a W" & _
                 "MI como el usuario"
    WScript.Echo """gondoradministrator"", suministrando como cont" & _
                 "raseña de conexión """"Nunca la"
    WScript.Echo "sabrás"""". En lugar de mostrarse por pantalla, l" & _
                 "os resultados se almacenarán en"
    WScript.Echo "el archivo ""e:gondorcambio-dns.txt"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-dns-a-conexion.vbs"
    WScript.Echo "/L:192.168.0.200,192.168.0.201,192.168.0.202 /F:c" & _
                 ":gondorequipos.txt"
    WScript.Echo "/O:e:gondorcambio-dns.txt /U:gondoradministrat" & _
                 "or /C:""Nunca la sabrás"""
    WScript.Echo """Conexión de área local"""
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_ServicioWMI(obj_ServicioWMI, str_Usuario, _
                       str_Clave, str_Equipo, _
                       str_Espacio)
'***********************************************************************
'* Procedimiento: f_ServicioWMI                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función permite conectar con el servicio WMI    *
'*                de un equipo. La conexión puede ser realizada        *
'*                directamente por el usuario que ha lanzado el        *
'*                script o por otro usuario cuyas credenciales son     *
'*                recibidas como parámetros. La función recibe como    *
'*                parámetro un objeto que será utilizado como          *
'*                parámetro de salida, siendo creado por la función    *
'*                como objeto de servicio WMI del equipo recibido      *
'*                como parámetro. Si recibe usuario, contraseña y      *
'*                nombre de equipo a conectar, conectará con ése       *
'*                equipo con las credenciales pasadas, siempre y       *
'*                cuando no se trate del equipo local, en cuyo caso    *
'*                no se conectará con credenciales alternativas si no  *
'*                con el usuario que lanza el script. Si está vacío    *
'*                el parámetro str_Espacio, se conectará con el        *
'*                espacio de nombres rootCIMV2, en caso contrario     *
'*                con el espacio pasado.                               *
'***********************************************************************

    Dim obj_LocalizadorWMI
    Dim lng_Respuesta

    If Len(str_Espacio) = 0 Then str_Espacio = "rootCIMV2"

    'Si hemos recibido nombre de usuario, debemos conectar
    'al servicio WMI del equipo como el usuario
    'recibido. en el caso de que se trate del equipo local
    'ignoramos las credenciales alternativas
    If Len(str_Usuario) > 0 _
    And Not f_EquipoLocal(str_Equipo) Then

        'Para poder especificar unas credenciales alternativas,
        'debemos crear primero un localizador WMI
        Set obj_LocalizadorWMI = CreateObject( _
                                  "WbemScripting.SWbemLocator")

        'Establecemos control de errores
        On Error Resume Next

        'Conectamos con el servicio WMI del equipo con las
        'credenciales pasadas
        Set obj_ServicioWMI = obj_LocalizadorWMI.ConnectServer( _
                                       str_Equipo, str_Espacio, _
                                       str_Usuario, str_Clave)

        'Si se ha producido algún error...
        If Err.Number <> 0 Then

            'Lo primero es vaciar la variable con el localizador WMI
            Set obj_LocalizadorWMI = Nothing

            'Mostramos el error
            WScript.Echo vbCrLf & vbCrLf & _
                         Err.Number & ": " & Err.Description

            'Vaciamos el objeto Err
            Err.Clear

            'Devolvemos False
            f_ServicioWMI = False

            'Salimos de la función
            Exit Function

        End If

    Else

        'Podemos conectar directamente con el servicio WMI del
        'equipo sin necesidad de utilizar el localizador WMI
        'ya que no hay que hacerlo con otras credenciales
        'distintas a las del usuario que lanza el script
        Set obj_ServicioWMI = GetObject("winmgmts:\" & _
                                    str_Equipo & "" & _
                                    str_Espacio)

        'si se ha producido algún error...
        If Err.Number <> 0 Then

            'Mostramos el error
            WScript.Echo Err.Number & ": " & Err.Description & _
                         vbCrLf & vbCrLf

            'Vaciamos el objeto Err
            Err.Clear

            'Devolvemos False
            f_ServicioWMI = False

            'Salimos de la función
            Exit Function

        End If

    End If

    'No se han producido errores, devolvemos True
    f_ServicioWMI = True

    'Limpieza de culito :-)
    Set obj_LocalizadorWMI = Nothing

End Function 'f_ServicioWMI


Function f_EquipoLocal(str_Equipo)
'***********************************************************************
'* Procedimiento: f_EquipoLocal                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo y comprueba  *
'*                si se trata del equipo local o de uno remoto. Si es  *
'*                el equipo local devuelve True, si es remoto False.   *
'*                De paso, si como nombre de equipo local recibió "."  *
'*                cambiará en la variable recibida al nombre           *
'*                verdadero del equipo                                 *
'***********************************************************************

    Dim obj_SH, str_EquipoEntorno

    f_EquipoLocal = False

    'Creamos un objeto WshShell
    Set obj_SH = CreateObject("WScript.Shell")

    'Obtenemos el valor de la variable de entorno con
    'el nombre de equipo
    str_EquipoEntorno = UCase( _
       obj_SH.ExpandEnvironmentStrings("%COMPUTERNAME%"))

    'Si está vacío el nombre de equipo, o es ".",
    'se trata del equipo local; lo asignamos a la
    'variable
    If Len(str_Equipo) = 0 _
    Or str_Equipo = "." Then


        str_Equipo = str_EquipoEntorno
        f_EquipoLocal = True

    'Ahora revisamos no se haya pasado el FQDN del equipo
    'local o su nombre NetBios
    ElseIf _
        ( _
        Len(str_Equipo) > Len(str_EquipoEntorno) _
        And UCase(Left(str_Equipo, Len(str_EquipoEntorno))) = _
                      UCase(str_EquipoEntorno) _
        And Mid(str_Equipo, Len(str_EquipoEntorno) + 1, 1) = _
                      "." _
        ) _
    Or UCase(str_Equipo) = UCase(str_EquipoEntorno) Then

            str_Equipo = str_EquipoEntorno
            f_EquipoLocal = True

    End If

End Function 'f_EquipoLocal


Function f_EntrarClave(str_HTML)
'***********************************************************************
'* Procedimiento: f_EntrarClave                                        *
'* Tipo         : Función                                              *
'* Devolución   : Cadena                                               *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : El propósito de esta función es el proveer al        *
'*                usuario de una caja de texto en la que teclear una   *
'*                contraseña sin revelarla, pues la caja de texto es   *
'*                de tipo password. Para ello se crea una página web   *
'*                que es cargada en un Internet Explorer y se recoge   *
'*                de éste la contraseña tecleada y se convierte en la  *
'*                devolucion de la función. La ruta y nombre de la     *
'*                página es recibida como parámetro por la función,    *
'*                lo que permite reutilizar esta función en más        *
'*                scripts y personalizar la página para cada script,   *
'*                lo único que debe ser igual en todas las páginas     *
'*                que se quieran utilizar es que el botón debe         *
'*                llamarse Aceptar, el control oculto AceptarPulsado   *
'*                y la caja de texto Clave.                            *
'*                                                                     *
'*                Esta función está basada en:                         *
'*http://www.microsoft.com/technet/scriptcenter/guide/sas_ent_lppm.msp
'*x?mfr=true
'*                                                                     *
'*                En el ejemplo de TechNet se pone una ruta local      *
'*                (c:carpetafichero.asp) para la ubicación del       *
'*                fichero. Esto no es correcto cuando estamos de XP    *
'*                SP2 en adelante, pues la navegación segura           *
'*                interfiere con el script, ya que contiene un script  *
'*                VBScript. Para evitar esto, yo lo que hago es        *
'*                situar el fichero en una carpeta compartida y        *
'*                acceder a él con su ruta UNC; de esta manera es      *
'*                tratado como de la zona de intranet y no hay         *
'*                problemas. También se podría colocar en un servidor  *
'*                Web que fuese de la intranet o de los sitios de      *
'*                confianza y referirse a él por su ruta http; la      *
'*                mejor opción de todas sería situarlo en un servidor  *
'*                web seguro, y poner su ruta https, de esa manera     *
'*                eludimos a alguien que esté usando un sniffer        *
'*                                                                     *
'*                El código de la página puede ser tan simple como:    *
'*                <html>                                               *
'*                <script language="VBScript">                         *
'*                <!--                                                 *
'*                Sub Aceptar_OnClick()                                *
'*                                                                     *
'*                AceptarPulsado.Value = "Pulsado"                     *
'*                                                                     *
'*                End Sub                                              *
'*                -->                                                  *
'*                </script>                                            *
'*                <body>                                               *
'*                Entre la contraseña del usuario con el que se        *
'*                conectará al servicioWMI del equipo:                 *
'*                <input type="password" name ="Clave" size="20">      *
'*                <p><input name="Aceptar" type="button"               *
'*                value="Aceptar" ></p>                                *
'*                <p><input type="hidden" name="AceptarPulsado"        *
'*                size="20"></p>                                       *
'*                </body></html>                                       *
'***********************************************************************

    'Declaramos variables
    Dim obj_IE

    'Creamos un objeto Internet Explorer
    Set obj_IE = WScript.CreateObject _
              ("InternetExplorer.Application", "IE_")

    'Cargamos el navegador con la página recibida como parámetro
    obj_IE.Navigate str_HTML

    'Con este bucle esperamos a que la página esté completamente cargada
    Do

        WScript.Sleep 10

    Loop Until obj_IE.ReadyState = 4

    'Establecemos propiedades del navegador
    obj_IE.Toolbar = 0
    obj_IE.StatusBar = 0
    obj_IE.Width = 400
    obj_IE.Height = 250
    obj_IE.Left = 0
    obj_IE.Top = 0
    obj_IE.Visible = 1

    'En este bucle esperamos a que se haya pulsado el botón
    '"Aceptar"
    Do While (obj_IE.Document.All.AceptarPulsado.Value = "")

        WScript.Sleep 250

    Loop

    'Recogemos la contraseña entrada
    str_Clave = obj_IE.Document.All.Clave.Value

    'Cerramos el navegador
    obj_IE.Quit

    'Esperamos a que esté cerrado
    WScript.Sleep 250

    'Establecemos la contraseña como devolución de la función
    f_EntrarClave = str_Clave

    'Limpiadita de culito :-)
    Set obj_IE = Nothing

End Function      'f_EntrarClave

Function f_EquipoResponde(str_Equipo) 'As Boolean
'***********************************************************************
'* Procedimiento: f_EquipoResponde                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo (ya sea      *
'*                nombre en sí o IP) y, por medio de PING, revisa si   *
'*                el equipo responde o no                              *
'***********************************************************************

    'Objeto shell para ejecutar ping y
    'enviar la salida a un fichero temporal
    Dim obj_Shell 'As Object
    'Objeto FileSystem para abrir y borrar
    'el fichero temporal
    Dim obj_FileSystem 'As Object
    'Objeto TextStream para leer el fichero
    'temporal
    Dim obj_Fichero 'As Object
    'Se volcará en esta variable el
    'contenido del fichero temporal
    Dim str_ContenidoFichero 'As String
    'Sirve para establecer la ruta y
    'nombre del fichero temporal
    Dim str_FicheroTemporal 'As String

    'Creamos los objetos FileSystem y Shell
    Set obj_Shell = CreateObject("WScript.Shell")
    Set obj_FileSystem = CreateObject("Scripting.FileSystemObject")

    'Establecemos el fichero temporal en la ruta
    'de este libro de Excel y con el nombre
    '"temp.txt"
    str_FicheroTemporal = _
             obj_Shell.ExpandEnvironmentStrings( _
                                 "%TEMP%temp.txt")

    'Ejecutamos el ping volcando la salida en el
    'fichero temporal. Sólo esperaremos un eco ("-n 1")
    obj_Shell.Run "cmd /c ping -n 1 " & str_Equipo & " > """ & _
                  str_FicheroTemporal & """", 0, True

    'Abrimos el fichero temporal sobre el objeto fichero
    Set obj_Fichero = obj_FileSystem.OpenTextFile( _
                              str_FicheroTemporal, 1, False)

    'Volcamos el contenido del fichero temporal
    'en str_ContenidoFichero
    str_ContenidoFichero = obj_Fichero.ReadAll

    'Cerramos el fichero temporal y vaciamos su variable
    obj_Fichero.Close
    Set obj_Fichero = Nothing

    'Borramos el fichero temporal y vaciamos
    'los objetos Shell y FileSystem
    obj_FileSystem.DeleteFile (str_FicheroTemporal)
    Set obj_FileSystem = Nothing
    Set obj_Shell = Nothing

    'Si encontramos la cadena "TTL=" significa
    'que el equipo respondió y por tanto la función
    'devuelve True, en caso contrario significa que
    'no respondió el equipo y por tanto devuelve
    'False
    If InStr(str_ContenidoFichero, "TTL=") > 0 Then
        f_EquipoResponde = True
    Else
        f_EquipoResponde = False
    End If

End Function 'f_EquipoResponde

 

 

10 comentarios to “Script VBScript Para Cambiar La Configuración DNS De Varios Equipos (2)”

  1. […] equipos estn encendidos: Script VBScript Para Cambiar La Configuracin DNS De Varios Equipos (2) https://urpiano.wordpress.com/2007/10…ios-equipos-2/ — Un saludo Fernando Reyes [MVP Windows Server] MCSA Windows 2003 MCSE WIndows 2000 / 2003 […]

  2. Matias said

    Hola disculpen la molestia, pero tengo problemas para hacer funcionar los script para cambiar la configuración DNS en varios equipos.
    Por ejemplo con este ejemplo se tiene que copiar la configuración tal como esta:
    cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /E:gandalf,pippin,frodo “Conexión de área local”
    Me podrían pasar un ejemplo funcionando para tomar como referencia.
    Les agradezco si me pueden ayudar

    Saludos

    • urpiano said

      Matias,

      En el ejemplo se establecerán los servidores DNS:

      192.168.0.200
      192.168.0.201
      192.168.0.202

      En ese mismo orden. Esto se hará en los equipos gandalf,pippin y frodo y en la conexión de red que se llama “Conexión de área local”. Tengo este otro script de cambio de DNSs desarrollado en PowerShell que a lo mejor cuadra más con lo que necesitas.

      • Matias said

        Lo que no entiendo es donde esta el código que hace referencia a este archivo cambiar-dns-a-conexion.vbs, porque si ejecuto esto cscript //nologo cambiar-dns-a-conexion.vbs /L:192.168.0.200,192.168.0.201,192.168.0.202 /E:gandalf,pippin,frodo “Conexión de área local” me da un error de script.

      • urpiano said

        Matias,

        No sé si no te he entendido, corrígeme si no van por aquí los tiros…

        El código del script tienes que guardarlo en un fichero de texto al que le cambias la extensión a VBS. En los ejemplos del código a ese fichero le he llamado cambiar-dns-a-conexion.vbs, pero se le puede llamar como se desee. Si el inductor de la ventana de comandos no está situado en la misma carpeta donde esté el script, es necesario pasarle ruta y nombre, no solo el nombre.

  3. Matias said

    Urpiano disculpa las molestias pero podrías pasarme el código script completo para cambiar servidores DNS, WINS etc en varios equipos de una red, yo se hacerlo en un solo equipo mediante PsExec, pero necesito una manera de hacerlo para varios equipos, este es el código que uso, que modificación tendría que hacerle al código para que se aplique en varios equipos pero sin usar GPO

    strSecondaryServer = “”
    objNetCard.SetWINSServer strPrimaryServer, strSecondaryServer

    Next

    On Error Resume Next

    strComputer = “.”
    Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)

    Set objNetworkSettings = objWMIService.Get(“Win32_NetworkAdapterConfiguration”)
    arrDNSSuffixes = Array(“”, “”)
    objNetworkSettings.SetDNSSuffixSearchOrder(arrDNSSuffixes)

    On Error Resume Next

    strComputer = “.”
    strDNSDomain = “”

    Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)
    Set colNicConfigs = objWMIService.ExecQuery _
    (“SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)

    For Each objNicConfig In colNicConfigs
    strDNSHostName = objNicConfig.DNSHostName
    Next
    WScript.Echo VbCrLf & “DNS Host Name: ” & strDNSHostName

    For Each objNicConfig In colNicConfigs
    WScript.Echo VbCrLf & _
    ” Network Adapter ” & objNicConfig.Index & VbCrLf & _
    ” ” & objNicConfig.Description & VbCrLf & _
    ” DNS Domain – Before: ” & objNicConfig.DNSDomain
    intSetDomain = objNicConfig.SetDNSDomain(strDNSDomain)
    If intSetDomain = 0 Then
    WScript.Echo ” Successfully set DNS domain to ” & strDNSDomain
    ElseIf intSetDomain = 1 Then
    WScript.Echo ” Successfully set DNS domain to ” & strDNSDomain & _
    VbCrLf & ” Must reboot.”
    Else
    WScript.Echo ” Unable to set DNS domain.”
    End If
    Next

    WScript.Echo VbCrLf & String(80, “-“)

    Set colNicConfigs = objWMIService.ExecQuery _
    (“SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)

    For Each objNicConfig In colNicConfigs
    strDNSHostName = objNicConfig.DNSHostName
    Next
    WScript.Echo VbCrLf & “DNS Host Name: ” & strDNSHostName

    For Each objNicConfig In colNicConfigs
    WScript.Echo VbCrLf & _
    ” Network Adapter ” & objNicConfig.Index & VbCrLf & _
    ” ” & objNicConfig.Description & VbCrLf & _
    ” DNS Domain – After: ” & objNicConfig.DNSDomain
    Next

    On Error Resume Next

    strComputer = “.”
    blnFullDNSRegistrationEnabled = True
    blnDomainDNSRegistrationEnabled = False

    Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)
    Set colNicConfigs = objWMIService.ExecQuery _
    (“SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)

    For Each objNicConfig In colNicConfigs
    strDNSHostName = objNicConfig.DNSHostName
    Next
    WScript.Echo VbCrLf & “DNS Host Name: ” & strDNSHostName

    For Each objNicConfig In colNicConfigs
    WScript.Echo VbCrLf & _
    ” Network Adapter ” & objNicConfig.Index & VbCrLf & _
    ” ” & objNicConfig.Description & VbCrLf & _
    ” DNS Full Registration Enabled – Before: ” & _
    objNicConfig.FullDNSRegistrationEnabled & VbCrLf & _
    ” DNS Domain Registration Enabled – Before: ” & _
    objNicConfig.DomainDNSRegistrationEnabled
    intDynReg = objNicConfig.SetDynamicDNSRegistration _
    (blnFullDNSRegistrationEnabled, blnDomainDNSRegistrationEnabled)
    If intDynReg = 0 Then
    WScript.Echo VbCrLf & ” Successfully set dynamic DNS registration.”
    ElseIf intDynReg = 1 Then
    WScript.Echo VbCrLf & _
    ” Successfully set dynamic DNS registration.” & _
    VbCrLf & ” Must reboot.”
    Else
    WScript.Echo VbCrLf & ” Unable to set dynamic DNS registration.”
    End If
    Next

    WScript.Echo VbCrLf & String(80, “-“)

    Set colNicConfigs = objWMIService.ExecQuery _
    (“SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)

    For Each objNicConfig In colNicConfigs
    WScript.Echo VbCrLf & ” Network Adapter ” & objNicConfig.Index & _
    VbCrLf & ” ” & objNicConfig.Description & VbCrLf & _
    ” DNS Full Registration Enabled – After: ” & _
    objNicConfig.FullDNSRegistrationEnabled & VbCrLf & _
    ” DNS Domain Registration Enabled – After: ” & _
    objNicConfig.DomainDNSRegistrationEnabled
    Next

    WScript.Echo “Fin de la Ejecución…”

    Espero tu respuesta y agradezco tu ayuda

    Saludos

    • urpiano said

      Si ese código te funciona en local, podrías, como dices, usar PsExec para llamarlo, de manera que te creas un BAT en el vas haciendo la llamadas para cada equipo. Lo único que tendrías es que retocar el código para que recibiera un parámetro, el del nombre del equipo. Para ello deberçias sustituir:

      strComputer = “.”

      Por:

      strComputer = WScript.Arguments(0)

      La llamada al script sería (no sé cómo llamas a tu script, voy a suponer que le llamas cambiar-red.vbs):

      cscript //nologo cambiar-red.vbs equipo

  4. Matias Guarinoni said

    Urpiano como andas,

    Tengo alguna forma de correr este script en varios equipos al mismo tiempo, osea no usar PsExec sino quizá hacerle algún cambio al script para que se ejecute en varios equipos.
    Porque si acá strComputer = “.” le agrego varios equipos no funciona.
    Me podrías pasar una dirección de correo para hacerte algunas consultas directamente si no te incomoda.

    Muchas gracias

    Saludos

    • urpiano said

      Sí, usando un objeto swbemlocator para crear el objeto swbemservices, en lugar de crearlo directamente. Es decir, en lugar de poner:

       'Para poder especificar unas credenciales alternativas,
      'debemos crear primero un localizador WMI
      Set obj_LocalizadorWMI = CreateObject( _
                                        "WbemScripting.SWbemLocator")
      
      'Conectamos con el servicio WMI del equipo con las
      'credenciales pasadas
      Set objWMIService = obj_LocalizadorWMI.ConnectServer( _
                                     str_Equipo, "root\CIMv2", _
                                     str_Usuario, str_Password)
      
  5. Matias Guarinoni said

    Disculpa la molestia, pero como quedaría el código completo, me podrías pasar un ejemplo funcionando, una consulta de donde puedo bajar algún libro o alguno que tu me recomiendes para aprender VBScript, me interesaría para la parte de windows.

    Gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: