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 Para Activar / Desactivar Una Conexión De Red

Posted by urpiano en Miércoles 13 \13\UTC diciembre \13\UTC 2006

Este script VBScript permite activar/desactivar la conexión de red cuyo nombre recibe como parámetro. En el caso de que esté activada la desactiva y si está activada la desactiva.

Se basa en el uso del objeto Shell.Application, el método Namespace de éste, que permite referirse a determinadas carpetas del sistema, como en este caso el panel de control, y en el uso de verbos de la conexión de red para activar o no la conexión:

Shell Object
http://msdn2.microsoft.com/en-gb/library/ms630423.aspx

NameSpace Method (Shell)
http://msdn2.microsoft.com/en-gb/library/ms630418.aspx

ShellSpecialFolderConstants Enumerated Type
http://msdn2.microsoft.com/en-gb/library/ms630424.aspx

Este script tiene una debilidad, dada su forma de trabajo. Esta debilidad es el idioma, pues lleva en el código los nombres de los verbo y de la carpeta de conexiones de red, que cambian según el idioma en el que esté el sistema operativo. Si en español el verbo activar es &Activar, en Inglés es En&able, así como en Español la carpeta de conexiones de red es Conexiones de red y en Inglés es Network Connections. Así pues, si necesitamosque se pueda ejecutar en más de un lenguage, o tenemos un script por idioma o creamos una función de reconocimiento del lenguaje en el que está el sistema y en función de ello devuelva los verbos y nombres de carpeta correspondientes. En este caso el script que pongo es el correspondiente al Español.

La debilidad anteriormente descrita podría ser evitada cambiando la forma de trabajo del script, pasando de usar el objeto Shell a usar WMI, en concreto la clase Win32_NetworkAdapter del espacio CIMV2, ya que de esa manera tratamos con la conexión directamente, olvidándonos de verbos y de la carpeta conexiones de red. Por desgracia, esta operativa sólo puede ser realizada en Windows Vista y Longhorn Server, pues son los únicos Windows que tiene los métodos Enable y Disable para la clase Win32_NetworkAdapter:

Enable Method of the Win32_NetworkAdapter Class
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/enable_method_in_class_win32_networkadapter.asp

Disable Method of the Win32_NetworkAdapter Class
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/disable_method_in_class_win32_networkadapter.asp

El script recibe como parámetro el nombre de una conexión de red (no diferencia mayúsculas de minúsculas). La forma de lanzarlo es:

cscript [//nologo] activa-desactiva-conexion-de-red.vbs conexión

Donde conexión es el nombre de la conexión de red. Ejemplos:

cscript activa-desactiva-conexion-de-red.vbs "Conexión de área local"
cscript //nologo activa-desactiva-conexion-de-red.vbs Privada

He aquí el código del script:

 

'activa-desactiva-conexion-de-red.vbs

'Este script VBScript permite activar o desactivar una conexión de red 
'que se recibe como parámetro. Si está activada la desactivará y si
'está desactivada la activará.

'Sintaxis:

'cscript [//nologo] activa-desactiva-conexion-de-red.vbs <conexión>

'Siendo <conexión> el nombre de la conexión de red que se debe
'activar/desactivar. Ejemplos:

'cscript activa-desactiva-conexion-de-red.vbs "Conexión de área local"
'cscript //nologo activa-desactiva-conexion-de-red.vbs Privada

'© Fernando Reyes - 12/2006

Option Explicit


If WScript.Arguments.Count <> 1 Then

    WScript.Echo "Error 1: Número de parámetros erroneo."
    WScript.Echo
    WScript.Echo _
    "activa-desactiva-conexion-de-red.vbs: Script VScript que sirve para"
    WScript.Echo _
    "activar la conexión de red recibida como parámetro, si se encuentra"
    WScript.Echo "desactivada; en caso de estar activad la desactivará."
    WScript.Echo 
    WScript.Echo _
       "Modo de uso - se debe lanzar con cscript de la siguiente manera:"
    WScript.Echo 
    WScript.Echo _
       "cscript //nologo activa-desactiva-conexion-de-red.vbs <conexion>"
    WScript.Echo 
    WScript.Echo "Siendo:"
    WScript.Echo 
    WScript.Echo _
    "<conexion>: el nombre la conexión de red; si incluye espacios deberá"
    WScript.Echo "            estar encerrado entre comillas."
    WScript.Echo 
    WScript.Echo "Ejemplo:"
    WScript.Echo 
    WScript.Echo _
               "cscript //nologo activa-desactiva-conexion-de-red.vbs " & _
                             """Conexión de área local"""
    WScript.Quit 1

End If

'Definimos la constante ShellSpecialFolder correspondiente
'al Panel de control:
'ShellSpecialFolderConstants Enumerated Type
'http://msdn2.microsoft.com/en-gb/library/ms630424.aspx
Const ssfCONTROLS = 3 

'Declaramos las variables que usaremos

Dim bol_ConexionEncontrada
Dim str_Conexion, str_CarpetaConexionesDeRed
Dim str_VerboActivar, str_VerboDesactivar
Dim obj_Verbo
Dim obj_AplicacionShell, obj_PanelDeControl
Dim obj_ElementoDePanelDeControl
Dim fol_CarpetaConexionesDeRed, obj_Conexion

'Recogemos la conexión a activar-desactivar del parámetro
'recibido
str_Conexion = WScript.Arguments(0) 

'Estas son las cadenas que definen los verbos del objeto
'conexión para activar o desactivar la conexión. Este es el
'defecto de tener que hacer esto por medio de verbos, en lugar hacerlo
'con WMI, pues en cada idioma el verbo es diferente y por tanto se debe
'retocar el script según lenguaje. No sólo según lenguaje, pues tanto los
'verbos como la carpeta de conexiones de red varían según la versión de
'de Windows, siendo diferentes en Windows 2000 a los que hay en Windows XP
'y 2003. Este script contempla las versiones 2000/XP y 2003, utilizando 
'los nombres correspondientes. Sólo en Vista y Longhorn Server se
'puede activar/desactivar una conexión por medio de WMI, usando el objeto
'Win32_NetworkAdapter del espacio CIMV2, pues este objeto incluye los métodos
'Enable y Disable, cosa que no sucede con versiones anteriores de Windows:

'Enable Method of the Win32_NetworkAdapter Class
'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi
'/enable_method_in_class_win32_networkadapter.asp

'Disable Method of the Win32_NetworkAdapter Class
'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi'
'/disable_method_in_class_win32_networkadapter.asp

'Después de este rollo, aquí es donde definimos los verbos y el nombre
'de la carpeta de conexiones de red por medio de una llamada a la
'función que mira la versión del SO y asigna los nombres que correspondan
str_CarpetaConexionesDeRed = f_CarpetaConexiones(str_VerboActivar, _
                                                 str_VerboDesactivar)

'Creamos un objeto aplicación shell
Set obj_AplicacionShell = CreateObject("shell.application") 

'cargamos el panel de control, por medio del método Namespace,
'pasándole la constante del panel de control
Set obj_PanelDeControl = obj_AplicacionShell.Namespace(ssfCONTROLS) 

'Recorremos ahora los diferentes elementos del panel de control
For Each obj_ElementoDePanelDeControl In obj_PanelDeControl.items 

    'Revisamos que se trate de la carpeta de conexiones de red y en caso de
    'serlo, cargamos la carpeta en su objeto
    If UCase(obj_ElementoDePanelDeControl.Name) = _
    	                                    UCase(str_CarpetaConexionesDeRed) Then 

        Set fol_CarpetaConexionesDeRed = obj_ElementoDePanelDeControl.GetFolder
        Exit For 

    End If 

Next 


bol_ConexionEncontrada = False

'Recorremos ahora las conexiones de red existentes
For Each obj_Conexion In fol_CarpetaConexionesDeRed.items 


    'Si encontramos la conexión recibida como parámetro la cargamos
    'en su objeto
    If UCase(obj_Conexion.Name)  = UCase(str_Conexion) Then 

'        Set obj_ConexionDeRed = obj_Conexion
'        Exit For 

        'Recorremos ahora los verbos de la conexión. Si la
        'conexión está activada no tendrá el verbo activar,
        'si está desactivada no tendrá el verbo desactivar;
        'de esta manera sabremos en qué estado está y por tanto
        'qué verbo invocar para cambiar su estado.
        For Each obj_Verbo In obj_Conexion.Verbs 
        
            If obj_Verbo.Name = str_VerboActivar Then
        
               'Hemos encontrado el verbo Activar, por tanto
               'activamos la conexión, pues está desactivada
               'Para ello invocamos el método DoIt del verbo
                obj_Verbo.DoIt
                Exit For
        
            ElseIf obj_Verbo.Name = str_VerboDesactivar Then 
        
               'Hemos encontrado el verbo Desactivar, por tanto
               'desactivamos la conexión, pues está activada
               'Para ello invocamos el método DoIt del verbo
                obj_Verbo.DoIt
                Exit For
        
            End If 
        
        Next 

        bol_ConexionEncontrada = True
        Exit For

    End If 

Next 

'Si no hemos encontrado la conexión recibida como parámetro lo advertimos
'y salimos del script
If Not bol_ConexionEncontrada Then

  WScript.Echo "Error 2: No se ha encontrado la conexión de red " & _
               """" & str_Conexion & """" 
  WScript.Quit 2

End If 

'Damos tiempo a que se complete la operación de habilitar 
'o deshabilitar
WScript.Sleep 2000 

'Nos limpiamos el culito :-)
Set obj_Verbo = Nothing
Set obj_AplicacionShell = Nothing
Set obj_PanelDeControl = Nothing
Set obj_ElementoDePanelDeControl = Nothing
Set fol_CarpetaConexionesDeRed = Nothing
Set obj_Conexion = Nothing


Function f_CarpetaConexiones(str_VerboActivar, _
              str_VerboDesactivar)
'Esta función devuelve cómo se llama la carpeta de conexiones
'de red según el sistema operativo que está ejecutando el script
'Recibe dos parámetros de salida, en los que almacenará los
'los nombres de los verbos para activar y desactivar correspondientes

    Dim str_Equipo
    Dim obj_ServicioWMI
    Dim col_OSs
    Dim obj_OS

    'Establecemos el equipo local
    str_Equipo = "."

    'Conectamos con el servicio WMI
    Set obj_ServicioWMI = GetObject("winmgmts:{impersonationLevel" & _
    "    =impersonate}!\" & str_Equipo & "rootcimv2″)

    'Obtenemos una consulta WQL de los SOs del sistema (sólo devolverá
    'uno, obviamente)
    Set col_OSs = obj_ServicioWMI.ExecQuery("Select * from " & _
                                      "Win32_OperatingSystem")
    'Recorremos la consulta (por supuesto, sólo será una vuelta)
    For Each obj_OS in col_OSs

        'Miramos si en la propiedad Caption del SO aparece XP o
        '2003, y en ese caso asignamos los verbos y devolvemos
        'el nombre de la carpeta de conexiones de red correspondientes
        'a Windows XP/2003
        If InStr(1,obj_OS.Caption,"XP") > 0 _
        Or InStr(1,obj_OS.Caption,"2003″) > 0 Then

        	  str_VerboActivar = "&Activar"
        	  str_VerboDesactivar = "&Desactivar"
        	  f_CarpetaConexiones = "Conexiones de red"

        'Si en la Caption aparece 2000 asignamos los verbos y el nombre
        'de la carpeta de conexiones de red de Windows 2000
        ElseIf InStr(1,obj_OS.Caption,"2000″) > 0 Then

        	  str_VerboActivar = "&Habilitar"
        	  str_VerboDesactivar = "&Deshabilitar"
        	  f_CarpetaConexiones = "Conexiones de red " & _
        	                        "y de acceso telefónico"

        'En caso contrario ¡instala un sistema operativo de verdad, tío!
        Else

        	  WScript.Echo "Error 3: este script sólo funciona con " & _
        	               "Windows 2000, Windows XP y Windows 2003″
        	  WScript.Quit 3

        End If

    Next

    Set obj_OS = Nothing
    Set col_OSs = Nothing
    Set obj_ServicioWMI = Nothing

End Function

7 comentarios to “Script Para Activar / Desactivar Una Conexión De Red”

  1. Gerardo Pérez said

    Hola,

    Primero que nada, ofrezco una disculpa por mi ignorancia.

    copie el scritp, tal y como esta para probrarlo, pero me marca un error en la siguiente línea:

    Set obj_ServicioWMI = GetObject(“winmgmts:{impersonationLevel” & _
    ” =impersonate}!\\\\” & str_Equipo & “\\root\\cimv2″)

    Y el mensaje de error es el siguiente:
    C:\ activa-desactiva-conexion-de-red.vbs(206,61) Error de compilación de Microsoft VBScript: Constante de cadena sin terminar.

    No se, si me puedas ayudar a indicar a que se debe este error.

    Te lo agradeceré infinitamente.
    Saludos cordiales,

  2. urpiano said

    ¡Menuda faenita me acaba de hacer WordPress! Ante todo gracias por tu mensaje, me ha hecho darme cuenta del regalito…

    resulta que WordPress hace una cosa que llaman textualización, y es que interpreta el código XHTML que tú pones y lo retoca, de forma que te hace párrafos nuevos por saltos de línea, por ejemplo. Poner código en WordPress es un auténtico dolor de muelas. Se supone que si tú pones el código encerrado entre <pre><code>aquí va el código</code></pre> te respetará el código que pongas, pero esto no es cierto, pues me veía obligado a poner los códigos de < (&lt;) y de > (&gt;) en lugar de sus caracteres y a poner dos backslash donde quiero que aparezca uno. Parece ser que ha habido un cambio en la textualización de WordPress y ya no es necesario el poner dos backslash en lugar de uno. Prueba ahora.

    Me toca cambiar todos los scripts que tengo publicados… :-(

  3. Gerardo Pérez said

    Muchas gracias Urpiano, por tus observaciones.

    Efectivamente, es culpa de la textualización.
    Estos son las líneas donde marca error:

    Error:
    Set obj_ServicioWMI = GetObject(“winmgmts:{impersonationLevel” & _
    ” =impersonate}!\\\\” & str_Equipo & “\\root\\cimv2?)
    Solución:
    Set obj_ServicioWMI = GetObject(“winmgmts:{impersonationLevel” & _
    ” =impersonate}!\\” & str_Equipo & “\root\cimv2″)

    Error:
    Or InStr(1,obj_OS.Caption,”2003?) > 0 Then
    Solución:
    Or InStr(1,obj_OS.Caption,”2003”) > 0 Then

    Esto mismo sucedio en las demas líneas semejantes, donde termina un número con comillas, wordpress pone signo de interogación.

    Una vez realizando esos cambios, el codigo funciona a la maravilla.

    Gracias por compartir tus conocimientos.
    Que Dios te bendiga.

  4. urpiano said

    ¡Qué extraño…! Lo de las comillas finales sustituidas por interrogación no me pasa, lo veo correcto.

  5. Raul said

    No me sale lo del signo de interrogación, pero me sucedía con otro caracter. Luego de corregir, funciona perfecto. Confimado.

    Quisiera hacerte una consulta: ¿Cual sería la modificación en este script como para que conecte unicamente cuando no hay acceso a la red?
    Sucede que tengo una conexión de adsl por ethernet y cada tanto se “cuelga” es decir se desconecta la banda ancha y me dá un error en la otra conexión, la PPoP que establece la conexión con el usuario y contraseña (Es el mismo error que se provoca cuando deshabilito la conexión de red manuelamente, pero en este caso la misma queda habilitada pero no tienen flujo de paquetes) Entonces si deshabilito e inmeditamente vuelvo habilitar la conexión, como la PPoP marca automáticamente, se reestablece el servicio. Es decir me sería muy útil contar con un script que se ejecute cada tantos minutos (podría meterlo como una tarea windows) y que me deshabilite y habilite la conexión pero unicamente si la misma no tiene flujo de paquetes.

    Gracias!!!!!!

  6. urpiano said

    Raul,

    Ufff, sólo se me ocurren métodos indirectos y que no me gustan. Por ejemplo, que se haga un ping a alguna dirección y si no responde ejecutar el script, pero ¿qué pasa si el sitio al que se hace ping está caído?

  7. dedalous said

    puede alguien subir el script a un servidor de almacenamiento gratuito para poder ver como funciona.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: