sábado, enero 03, 2009

Cazadores del servicio perdido.

Hace unos dias un buen amigo mio pidió ayuda en un foro sobre como tener acceso a los servicios de Windows que tuviera instalados en su computadora. Su pregunta era simple, solo quería saber si cierto servicio que el había instalada estaba corriendo o no, y en caso de que no estuviera en ejecución, pudiera arrancarlo desde su mismo código fuente, sin necesidad de entrar en el panel de servicios de Windows.

Le contestaron, pero las respuestas francamente dejaron mucho que desear.

Fue entonces cuando recordé que otro amigo mio, Rafa Carmona (The Full) había puesto un ejemplo muy interesante en Xailer sobre como acceder a los servicios de Windows utilizando el WMI (Windows Management Instrumentation) que simplificando es, basicamente, un API de Windows que te permite manipular distintos componentes del sistema operativo a través de OLE.

Revisando el ejemplo en Xailer, me di cuenta lo fácil que es realmente tener acceso a mucha información del sistema operativo e incluso manipularla, como es el caso de los servicios, veamos un ejemplo muy simple, y el ejemplo completo lo encontrarán en el archivo que acompaña a este post.

Bien, para conectarte con el WMI tienes que crear primero un objeto OLE y esto en xHarbour se hace así:

oWMI := CreateObject ("wbemScripting.SwbemLocator")

Esto solo crea el objeto, y ahora tenemos que conectarnos a el:

oWMICon := oWMI:ConnectServer()

WMI es GIGANTESCO, son varios objetos los que componen el sistema, la referencia completa de todos los objetos que lo integran lo encontrarás en el MSDN, te ahorro la búsqueda, simplemente haz click aquí y estarás en la documentación de WMI.

El siguiente paso es seleccionar que servicio queremos, en nuestro caso, queremos el servicio de "manipulación de servicios" valga la redundancia, asi que obtenemos todos los servicios mediante un query de SQL, algo como esto:

oServicios := oWMICon:ExecQuery("Select * from Win32_Service")

Así de fácil, la ejecución de este query devuelve en oServicios, un arreglo con objetos servicio de windows, cada objeto servicios a su vez contiene Métodos y propiedades que podemos manipular para lograr lo que queramos.

Y ahora jugamos con ellos, por ejemplo un listado de todos los servicios y el estado que tienen:

For each objService in oServicios

? objService:DisplayName +": "+objService:State

Next

También es posible arrancar, detener y reiniciar los servicios, porque tienes métodos como :StartService() :StopService() :ResumeService() : PauseService, y por su puesto, puede crear tus propios servicios o borrar los servicios existentes con :CreateService() y :DeleteService(), la referencia completa de métodos y clases está disponible haciendo click aquí.

Veamos un ejemplo mas interesante, supongamos que queremos arrancar el servicio de Advantage Database Server si este está detenido, entoces haríamos algo como esto:

oWMI := CreateObject ("wbemScripting.SwbemLocator")
oWMICon := oWMI:ConnectServer()

oADSServ := oWMICon:ExecQuery("Select * from Win32_Service where DisplayName = 'Advantage Database Server'")

IF oADSServ:State == "Stopped"

oADSServ:StartService()

ENDIF


Rafa nos ha proporcionado un ejemplo muy interesante escrito en Xailer, el cual puedes obtener haciendo click aquí, si no tienes Xailer no te preocupes, te he incluido tanto el proyecto Xailer, obviamente con código fuente así como el archivo ejecutable.

¡ Gracias Rafa por tan estupendo ejemplo !.

1 comentario:

Rafa Carmona dijo...

Bueno, me alegra que les sirva el ejemplo.

Fue lo primero que se me ocurrio de probar con Xailer, pues estaba metido en el mundo de los servicios ;-)

Existe un programa llamado VBSEdit, que nos servirá a nuestro proposito, usando VBScript, que fácilmente se puede usar en Harbour.

http://www.vbsedit.com/

Yo lo usó habitualmente si tengo que hacer algo con el WMI, y despues lo paso a Harbour.

Saludos