Error Consulta WMI

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
LookStop
Mensajes: 11
Registrado: 14 Feb 2012, 11:52

Error Consulta WMI

Mensaje por LookStop »

Hola,

Tengo una consulta WMI y me gustaría que si se introduce el password de administrador de la máquina remota mal, diese algún mensaje como que ha fallado la consulta. ¿Alguien sabe como hacer para que cuando se realice la consulta y falle, de un mensaje de error indicando que ha fallado la conexión o algo al usuario?

Gracias

$strComputer = "unequipo"
$strUser = "administrador"
$strPassword = InputBox("Dpto. Sistemas", "Introduce el pass del administrador local")

$objSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
$objWMIService = $objSWbemLocator.ConnectServer($strComputer, "root\cimv2", $strcomputer &"\" &$strUser, $strPassword)

$colItems = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
For $obj in $colItems
$ModEquipo = $obj.Model ;modelo del equipo
Next

Msgbox (0,"hola","El modelo del equipo es " & $ModEquipo)
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Error Consulta WMI

Mensaje por chekok »

Prueba controlando lo que devuelve @error así:

Código: Seleccionar todo

$strComputer = "unequipo"
$strUser = "administrador"
$strPassword = InputBox("Dpto. Sistemas", "Introduce el pass del administrador local")

$objSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
$objWMIService = $objSWbemLocator.ConnectServer($strComputer, "root\cimv2", $strcomputer &"\" &$strUser, $strPassword)
If @error = 1 Then
	MsgBox(0,"ERROR","Ha habido un error en la conexión")
	Exit
Else
	$colItems = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
	For $obj in $colItems
	$ModEquipo = $obj.Model ;modelo del equipo
	Next
	Msgbox (0,"hola","El modelo del equipo es " & $ModEquipo)
EndIf
No se si funcionará, porque no sé si el fallo de conexión devuelve 1 u otro valor, pero 1 sería lo más lógico. Tu mismo, prueba y coméntanos cual ha sido el resultado. Un saludo.
La vida es larga y dura.
LookStop
Mensajes: 11
Registrado: 14 Feb 2012, 11:52

Re: Error Consulta WMI

Mensaje por LookStop »

Parece como que si devuelve el valor "1", pero no muestra el mensaje.

En el Output me aparece esto:

$objWMIService = $objSWbemLocator.ConnectServer($strComputer, "root\cimv2", $strcomputer &"\" &$strUser, $strPassword)
$objWMIService = $objSWbemLocator.ConnectServer($strComputer, "root\cimv2", $strcomputer &"\" &$strUser, $strPassword)^ ERROR
>Exit code: 1 Time: 0.233
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Error Consulta WMI

Mensaje por chekok »

Ese error es de otro tipo, tienes algún error en el código que estás utilizando en esa línea concretamente que te muestra la salida de consola.
Verifica si le estás pasando los parámetros correctamente o si los valores de las variables que usas son los correctos.
O si el parámetro espera una cadena en lugar de un número (ya sabes, si el valor va entre comillado o no).
Intercala MsgBox con la salida del valor de la variables a modo de depuración, etc. puedes probar varias cosas para encontrar donde está el fallo.

Revisa estos puntos, seguro que encuentras donde está el problema.
La vida es larga y dura.
LookStop
Mensajes: 11
Registrado: 14 Feb 2012, 11:52

Re: Error Consulta WMI

Mensaje por LookStop »

A mi lo que me gustaría controlar es que cuando se introduzca mal la contraseña del administrador local y no se pueda hacer la conexión, que el programita lo notifique, que ha fallado la conexión o que la contraseña está mal introducida.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Error Consulta WMI

Mensaje por Ximorro »

Yo de WMI no sé prácticamente nada pero quizás sea un problema por cómo se usa el objeto.
Por ejemplo, en otros sitios cuando se pone una dirección empezando por el nombre de la máquina se empieza con "\\"
¿No será aquí igual?
Cuando pones el usuario intenta:
"\\" & $strcomputer & "\" &$strUser

Por otro lado otros ejemplos que he visto crean el objeto WMIService de esta manera:

Código: Seleccionar todo

$strComputer = "."
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
Y luego ya se hacen directamente los ExecQuery. Naturalmente la diferencia es que aquí no se pone el password y no sé cómo se hará, pero si conoces este método de hacerlo quizás puedas modificarlo y a lo mejor es la manera de entrar a WMI desde AutoIt.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
LookStop
Mensajes: 11
Registrado: 14 Feb 2012, 11:52

Re: Error Consulta WMI

Mensaje por LookStop »

Cuando realizas la conexión como dices es para usar las credenciales que tengas actualmente validadas en tu máquina. Para usar unas credenciales distintas, la conexión hay que hacerla de la forma que pongo. No he encontrado una forma mejor :smt003

Si el password está bien puesto, la conexión se hace correctamente a cualquier equipo dentro de una red, pero ¿que ocurre si el password que quieres usar para validarte en la máquina que quieres hacer la consulta esta mal puesto? Pues que el AutoIt da un error. Me gustaría poder presentar este error a quien este usando el programa y darle la oportunidad de volver a introducir el password para volver a intentarlo.

Muchas gracias por tu interés chekok
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Error Consulta WMI

Mensaje por Chefito »

Utiliza ObjEvent ( "AutoIt.Error" [, "function name"] ) para tratar los errores que produce autoit a causa de los errores que pueden generar los objetos COM. Con esto puedes utilizar una función para tratar el error. Tienes varias propiedades que te indicas cosas del error (descripción, número, etc) para poder hilar mas fino y tratarlos aun mejor. Mira esta función y sus ejemplos en la ayuda y comprenderás como funciona.

Así a lo chapucerillo, te pongo un pequeño ejemplo adaptado a tu código:

Código: Seleccionar todo

$strComputer = "unequipo"
$strUser = "administrador"
Global $salir=True, $seguirConObj=True

$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
$objSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")

$strPassword = InputBox("Dpto. Sistemas", "Introduce el pass del administrador local")

While $salir

	$objWMIService = $objSWbemLocator.ConnectServer($strComputer, "root\cimv2", $strcomputer &"\" &$strUser, $strPassword)
	If $seguirConObj Then
		$colItems = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
		For $obj in $colItems
			$ModEquipo = $obj.Model ;modelo del equipo
		Next
		Msgbox (0,"hola","El modelo del equipo es " & $ModEquipo)
		ExitLoop
	Else
		$seguirConObj=True
		MsgBox(0,"Error","Debe introducir el pass de nuevo")
		$strPassword = InputBox("Dpto. Sistemas", "Introduce el pass del administrador local")
	EndIf

WEnd

Func MyErrFunc($oError)
	$seguirConObj=False
    MsgBox(0,"","err.number is: " & @TAB & $oError.number & @CRLF & _
            "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            "err.description is: " & @TAB & $oError.description & @CRLF & _
            "err.source is: " & @TAB & $oError.source & @CRLF & _
            "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc
He puesto demasiados msgbox :smt005 . Pero quería que vieses que propiedades te devolvía ese error. Si analizas éstos, puedes mostrar un mensaje adecuado en cualquier otro tipo de error.

Otro apunte, te recomiendo que en un futuro cercano trates todos los errores que te pueda devolver autoit en algunas situaciones, como por ejemplo, en el caso de tu código, la creacción del objeto (objcreate). Mira las funciones en la ayuda. Ahí te lo pone (casi siempre @error=1 o un valor específico).

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
LookStop
Mensajes: 11
Registrado: 14 Feb 2012, 11:52

Re: Error Consulta WMI

Mensaje por LookStop »

Muchas gracias Chefito, al final he conseguido solucionarlo con esa idea que me has dado. Eres un crack.

Solo tuve que hacer una modificación y es meter un "Exit" al final:

Func MyErrFunc($oError)
$seguirConObj=False
MsgBox(0,"","err.number is: " & @TAB & $oError.number & @CRLF & _
"err.windescription:" & @TAB & $oError.windescription & @CRLF & _
"err.description is: " & @TAB & $oError.description & @CRLF & _
"err.source is: " & @TAB & $oError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
"err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
"err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
Exit
EndFunc ;==>_ErrFunc
Responder