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…

VBScript: Como Conectar A WMI Con Credenciales Alternativas

Posted by urpiano en Jueves 26 \26\UTC abril \26\UTC 2007

Una de las ventajas del uso de WMI de VBScript es que nos permite realizar tareas de recopilación de datos y de modificación de configuración no sólo en el propio equipo, si no también en equipos remotos. Si lanzamos un script como administrador del dominio, por ejemplo, no habrá problemas, pero ¿qué pasa si no queremos lanzarlo como administrador de nuestro dominio, si no de otro dominio, o, sencillamente, estamos logados como usuario normal y no deseamos lanzar el script usando RunAs? Para ello nos viene bien poder usar otras credenciales, pues sólo en el propio script el usuario es otro y con otros permisos y además nos permite trabajar en un dominio desde un grupo de trabajo u otro dominio para el cual no tenemos permiso y sí el usuario y contraseña correspondiente para ese otro dominio.

Lo habitual para trabajar con WMI es cargar un objeto SWbemServices de la siguiente manera:


Set obj_ServicioWMI = GetObject("winmgmts:\" & str_Equipo & _
                                        "rootCIMV2")

 

Con esa línea hemos conectado al espacio CIMV2 del equipo str_Equipo; si es el equipo local, puede ser especificado con su nombre o símplemente como “.”. Esta manera de conectar no tiene problemas cuando es lanzada por un usuario con permisos para así hacerlo; en muchos casos es suficiente, pero cuando queremos modificar cosas es necesario además que podamos no solo leer. Podríamos ejecutarlo como administrador del equipo o dominio, pero eso nos obliga a logarnos en el equipo como administradores (craso error) o lanzar el script por medio de RunAs (solución correcta). Esto, no obstante nos puede limitar a la hora de conectarnos a equipos de distintos dominios o de un dominio cuando estamos en un grupo de trabajo. Pasando credenciales alternativas a WMI, podemos desde cualquier equipo realizar tareas en otro, aunque sea de otro dominio. Una demostración de esto se puede ver en mi Libro Excel De Eventos v2.0, con el cual se puede operar con los visores de eventos de cualquier equipo de la LAN, sea o no de nuestro grupo de trabajo y/o dominio.

Para poder conectarnos WMI con credenciales alternativas, debemos crear el objeto SWbemServices no directamente, si no a través del uso de un objeto SWbemLocator y de su método ConnectServer, de la siguiente manera:



'De esta manera creamos el objeto SWbemLocator
Set obj_LocalizadorWMI = CreateObject( _
                                  "WbemScripting.SWbemLocator")

'Creamos el objeto SWbemServices por medio de una llamada a su método
'ConnectServer, pasándole el nombre del equipo (en el ejemplo
'es el valor que tenga la variable str_Equipo), el espacio (en el ejemplo
'CIMV2, el nombre de usuario), ya sea en formato NT "dominiousuario" o
'UPN "usuario@dominio.loquesea" (en el ejemplo es el valor que tenga la 
'variable str_Usuario) y por último la contraseña (en el ejemplo el contenido
'de la variable str_Clave
Set obj_ServicioWMI = obj_LocalizadorWMI.ConnectServer( _
                               str_Equipo, "rootcimv2", _
                               str_Usuario, str_Clave)

 

Para reutilizar código, yo lo que hago es tener una función que permite crear un objeto servicio WMI de una u otra manera en función de los parámetros que recibe:


Function f_ServicioWMI(obj_ServicioWMI, str_Usuario, _
                       str_Clave, str_Equipo)
'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

    Dim obj_LocalizadorWMI
    Dim lng_Respuesta

    'Si hemos recibido nombre de usuario, debemos conectar
    'al servicio WMI del equipo como el usuario
    'recibido
    If Len(str_Usuario) > 0 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, "rootcimv2", _
                                       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 & _
                                        "rootCIMV2")

        '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

 

Cuando esta función recibe nombre de usuario y contraseña, utiliza un objeto SWbemLocator para cargar el objeto SWbemServices con credenciales alternativas; en caso contrario lo carga directamente; la función devuelve True si la conexión se realiza con exito y en caso contrario devuelve False. Donde vayamos a cargar un objeto SWbemServices, podemos en su lugar llamar a esta función, con los valores de los parámetros que queramos según lo deseado y controlar si se produce un error al conectar. En este ejemplo conectamos al equipo poney-pisador, con el usuario breecebadilla y contraseña nomeacuerdo:


'Llamamos a la función que nos permite cargar el objeto
'SWbemLocator. Si la función devuelve False es que no se
'ha podido crear
If Not f_ServicioWMI(obj_ServicioWMI, _
                             "breecebadilla", _
                             "nomeacuerdo", _
                             "poney-pisador) Then

    'Lanzamos el mensaje de que ha habido un error en la conexión
    'al servicio WMI
    Wscript.Echo "Error 2: error al conectar con el servicio WMI"

    'Terminamos el script con el código de error 2
    WScript.Quit 2

End If

 

6 comentarios to “VBScript: Como Conectar A WMI Con Credenciales Alternativas”

  1. Rodolfo Reyes said

    Primero que nada gracias. La función me esta sirviendo mucho.

    ¿Existira alguna manera de que la contraseña no quede tan visible en el codigo fuente? ¿Habra alguna manera de encriptar la contraseña?

  2. urpiano said

    En este script tienes un ejemplo de cómo se puede pedir que el usuario teclee la contraseña, que es la mejor forma de hacerlo:Script VBScript Para Ver La Version De IIS. No obstante, si se trata de lanzar el script de forma desatendida, también puedes usar SCRENC.EXE para encriptar el script.

  3. […] de hecho está pensado para lanzarlo un administrador, pero mi amigo Fernando dice que puede usarse https://urpiano.wordpress.com/2007/04/26/vbscript-como-conectar-a-wmi-con-credenciales-alternativas/ para […]

  4. […] de hecho está pensado para lanzarlo un administrador, pero mi amigo Fernando dice que puede usarse https://urpiano.wordpress.com/2007/04/26/vbscript-como-conectar-a-wmi-con-credenciales-alternativas/ para […]

  5. […] está pensado para lanzarlo un administrador, pero mi amigo Fernando dice que puede usarse https://urpiano.wordpress.com/2007/04/26/vbscript-como-conectar-a-wmi-con-credenciales-alternativas/ para […]

  6. […] está pensado para lanzarlo un administrador, pero mi amigo Fernando dice que puede usarse https://urpiano.wordpress.com/2007/04/26/vbscript-como-conectar-a-wmi-con-credenciales-alternativas/ para […]

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: