Página 1 de 1
Error Consulta WMI
Publicado: 14 Feb 2012, 12:31
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)
Re: Error Consulta WMI
Publicado: 14 Feb 2012, 14:26
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.
Re: Error Consulta WMI
Publicado: 14 Feb 2012, 15:00
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
Re: Error Consulta WMI
Publicado: 14 Feb 2012, 15:10
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.
Re: Error Consulta WMI
Publicado: 14 Feb 2012, 15:44
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.
Re: Error Consulta WMI
Publicado: 15 Feb 2012, 08:54
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.
Re: Error Consulta WMI
Publicado: 15 Feb 2012, 09:53
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
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
Re: Error Consulta WMI
Publicado: 15 Feb 2012, 18:54
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
. 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.
Re: Error Consulta WMI
Publicado: 23 Feb 2012, 12:24
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