Archivo de la Categoría 'Windows Vista'

Software malintencionado de Windows.

Vaya por delante que en general me produce más simpatía como empresa Google que Microsoft. También es cierto que creo que en algunos puntos no andan tan lejos la una de la otra, y que si Microsoft hubiera hecho algunas de las cosas que Google ha llevado a cabo nos habríamos lanzado a su yugular, mientras que con Google somos mucho más permisivos y tolerantes. Pero bueno, se habrán ganado ese margen de crédito, no me parece mal.

El caso es que estos últimos días toquiteando cositas en mi PC me he encontrado con dos mensajes, uno de cada compañía, que me han resultado graciosos, con la salvedad que uno pretendía serlo y el otro no.

Voy primero con el de Google. En su día instalé el navegador Chrome, pero en tanto que nunca lo estaba utilizando y que esperaré a que esté en versiones más avanzadas y estables, decidí desinstalarlo. Al hacerlo me salió este mensaje:

Me hizo gracia ese ¿Es que hemos hecho algo mal? en tono victimista pero cómico. No sé, me pareció un guiño divertido con los usuarios.

Ahora el de Microsoft. Como sabréis, Windows Vista incorpora un gestor de actualizaciones bastante decente. Al menos si lo tienes bien configurado para que no tome el poder de tu máquina sin consultarte nada. Pues bien, en la última propuesta de actualizaciones me ha mostrado una bien curiosa:

¿Cómo que Herramienta de eliminacion de software malintencionado de Windows? ¿Me está diciendo que tengo en mi ordenador software malintencionado de Windows? ;-) No, no vale decir que eso es una redundancia… Pero cielos, a qué nivel de autocrítica han llegado los chicos de Microsoft. Admiten ya que existe tal cosa como software malintencionado de Windows. ¿Qué hará esa herramienta de eliminación de dicho software? ¿Un format C:?

PD. Lo sé, el ‘de Windows’ no se refiere realmente a ’software malintencionado’ sino a ‘Herramienta de eliminación’, pero igual les habría quedado mejor (¡aunque menos cómica!) una redacción como ‘Herramienta de Windows de eliminación de software malintencionado’…

Ambrosio o cómo crear un servicio de Windows obediente en .NET.

Últimamente he estado programando un servicio de Windows para que el sistema realice de manera periódica y en segundo plano unas determinadas tareas. En mi caso concreto se trata de replicar unas determinadas tablas desde una base de datos Oracle hacia otra MySQL con una determinada periodicidad en función de cada tabla (unos datos son más críticos y necesitan actualizarse cada hora, otros menos variables los actualizamos una vez al día durante las horas valle de actividad). El caso es que con VisualBasic.NET me ha resultado bastante sencillo crearlo y después instalarlo, así que paso a explicar un ejemplo de cómo hacer un sencillo servicio de Windows.

Paso 1. Creamos el proyecto.

Para empezar simplemente iniciamos VisualStudio.NET (en mi caso 2005) y seleccionamos la opción para crear un nuevo proyecto. Ahí seleccionamos Servicio de Windows, le damos un nombre agradable (a poder ser más que WindowsService1, por ejemplo ServicioAlertas) y aceptamos. Nos aparecerá directamente la clase Service1.vb que también podemos renombrar a algo más intuitivo como clsAlert.vb.

Paso 2. Agregamos un instalador.

En la vista diseño de la clase que se nos ha creado hacemos clic con el botón derecho del ratón y seleccionamos la opción Agregar instalador. Con esto se nos creará la clase ProjectInstaller.vb que contiene dos controles: ServiceInstaller1 y ServiceProcessInstaller1. En mi caso renombro estos dos controles simplemente para eliminarles el 1 final (maniático que es uno). Del código de ProjectInstaller.vb nos olvidaremos por completo, pero vamos a hacer algún ajuste en las propiedades de estos dos controles.

Paso 3. Configuramos el instalador.

En el control ServiceInstaller modificamos las propiedades DisplayName y ServiceName para dejarlas ambas en ServicioAlertas. Modificamos también la propiedad StartType para dejarla en Automatic. Esto último sirve para que después cuando instalemos el servicio, éste quede puesto para que arranque automáticamente al iniciarse el sistema operativo. Si no se desea este comportamiento, ajustar esta propiedad según convenga. Es decir:

DisplayName: ServicioAlertas
ServiceName: ServicioAlertas
StartType:   Automatic

En el control ServiceProcessInstaller modificamos la propiedad Account para dejarla en LocalSystem. Esto indica qué tipo de cuenta se utilizará para ejecutar el servicio. Podemos dejarla en User, pero después al instalar el servicio pedirá cuenta de usuario y contraseña, así que yo recomiendo pasarla a LocalSystem. Así pues:

Account:     LocalSystem

Con la clase ProjectInstaller.vb hemos terminado ya por completo, ahora nos centraremos en clsAlert.vb.

Paso 4. Programamos el servicio.

Accedemos al código de la clase clsAlert.vb y observamos que por defecto ya se nos han generado dos métodos: OnStart y OnStop. Está claro para lo que sirven, ¿no? Eso es, para configurar qué hacer y cómo para arrancar y detener el servicio. Personalmente no utilizo el OnStop para nada, así que no hablaré de él, pero por supuesto el que esté interesado puede buscar más información en la propia ayuda del IDE o en internet. Me voy a centrar en el OnStart y voy a ponerle un temporizador para que cada 5 segundos me escriba en un log la hora actual. Sí, lo sé, es un servicio de alertas mediocre, pero servirá como ejemplo de código sencillo con el que programar un servicio y hacer uso, además, de un temporizador (cosa terriblemente útil en ocasiones).

Muestro el código íntegro que dejo pues en la clase clsAlert.vb:

'--------------------------------------------------------------------
' Author:      Albert Mata (www.albertmata.net)
' Date:        20080723
' Description: Class to show how to create a Windows service and how
'              to work with a timer. 
'--------------------------------------------------------------------
Public Class clsAlert

    '----------------------------------------------------------------
    ' Attributes.
    '----------------------------------------------------------------
    Private DBTimer As System.Timers.Timer

    '----------------------------------------------------------------
    ' Starts service.
    '----------------------------------------------------------------
    Protected Overrides Sub OnStart(ByVal args() As String)
        'Creating timer with interval = 5000 milisec = 5 seconds.
        DBTimer = New System.Timers.Timer(5000)
        DBTimer.Enabled = True
        AddHandler DBTimer.Elapsed, AddressOf Me.ShowAlert
    End Sub

    '----------------------------------------------------------------
    ' Stops service.
    '----------------------------------------------------------------
    Protected Overrides Sub OnStop()
        'Void, as I'm not using this method.
    End Sub

    '----------------------------------------------------------------
    ' Main process executed every time DBTimer gives a signal.
    '----------------------------------------------------------------
    Private Sub ShowAlert(ByVal source As Object, _
    ByVal e As System.Timers.ElapsedEventArgs)
        DBTimer.Enabled = False
        Dim LogFile As New System.IO.StreamWriter("C:\log.txt", True)
        LogFile.WriteLine("Alerta www.albertmata.net - " & Date.Now)
        LogFile.Close()
        DBTimer.Enabled = True
    End Sub

End Class

Con esto tenemos terminado nuestro servicio de Windows. Ahora sólo nos falta instalarlo.

Paso 5. Generamos el ejecutable.

Generamos el ejecutable de nuestro servicio (Generar o Volver a generar). A partir de aquí no necesitamos más el IDE, de modo que podemos cerrarlo. A partir de ahora sólo necesitamos el .exe que se nos acaba de generar y un par de archivos .bat que vamos a crear a continuación (podríamos no generarlos y escribir las instrucciones directamente en línea de comandos, pero a mí me resulta más cómodo hacerlo en archivos batch). El archivo .exe (que encontramos en la carpeta bin/Release de nuestro proyecto ServicioAlertas) lo copiaremos en una ruta más corta (C:\). Y los dos archivos .bat que necesitamos son los siguientes:

Instalador.bat

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil 
                                 "C:\ServicioAlertas.exe"
pause

Desinstalador.bat

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil /U
                                 "C:\ServicioAlertas.exe"
pause

En ambos las dos primeras líneas deben ser una única línea continuada (el ancho del blog no lo permite) y la ruta de la aplicación InstallUtil puede variar ligeramente en función de la versión del Framework que estemos utilizando. Basta con verificarlo con el Explorador de Windows y modificarla según convenga.

Para lo que sirven está claro: uno instala el servicio y el otro lo desinstala.

Paso 6. Instalamos el servicio.

Simplemente ejecutamos el archivo Instalador.bat y se nos abrirá una ventana de línea de comando con el proceso de la instalación terminando exitosamente. Ahora nos vamos a Panel de control - Herramientas administrativas - Servicios y encontraremos nuestro servicio ServicioAlertas. Lo iniciamos y observaremos al cabo de pocos segundos que en la ruta C:\ se nos ha creado un archivo log.txt. Si dejamos el servicio un rato funcionando y después lo detenemos veremos que este archivo ha quedado más o menos así:

Alerta www.albertmata.net - 23/07/2008 21:12:18
Alerta www.albertmata.net - 23/07/2008 21:12:23
Alerta www.albertmata.net - 23/07/2008 21:12:28
Alerta www.albertmata.net - 23/07/2008 21:12:33
Alerta www.albertmata.net - 23/07/2008 21:12:38

Paso 7. Desinstalamos el servicio.

Si en algún momento queremos desinstalar el servicio (si es tan poco útil como ServicioAlertas seguro que querremos) solo debemos ejecutar Desinstalador.bat y el servicio quedará desinstalado (tendremos que refrescar la lista de servicios para ver que efectivamente así es).

Con esto queda visto el tema de los servicios de Windows. En internet se puede encontrar mucha otra información al respecto (p.ej. ésta en CodeGuru) en la que nos alertan de no utilizar MsgBox y similares en un servicio porque suelen dar problemillas. ;-)

Copias de seguridad con ROBOCOPY.

Imagino que a todos los que nos dedicamos a esto nos ocurre que constantemente estamos creando nuevos archivos, nuevas versiones del mismo código, nuevos ficheros que sustituyen al anterior… y vamos haciendo copias de seguridad aquí y allá. Al menos a mí me pasa. Y me pasa también que termino teniendo versiones distintas de una misma cosa en el ordenador portátil y en el de sobremesa, en el pendrive, en el disco duro externo, en el servidor de la empresa… ¡no fuera caso que se perdiera el trabajo!

Pues hace unos días me pregunté si no habría alguna manera fácil y rápida de mantener todo eso un poco más sincronizado. Y sí, claro, la hay. De buenas a primeras seguro que hay un montón de aplicaciones en Softonic que nos permiten hacer copias de seguridad incrementales de manera superprofesional. Pero yo buscaba algo más simple, algo más rápido. Y encontré Robocopy.

Robocopy es una herramienta para copiado de archivos y directorios que nos viene incorporada con Windows Vista (¡algo bueno tenía que tener Vista!). Hace cosas parecidas a las que se podrían hacer con Xcopy, pero si en una linea de comando escribimos:

xcopy /?

El propio sistema nos informa que Xcopy es obsoleto y que utilicemos Robocopy en su lugar. Probemos ahora a escribir:

robocopy /?

Recibimos una explicación de todos los posibles argumentos que podemos utilizar con Robocopy, algo que con alguna información extra añadida también podemos encontrar en la Wikipedia. Sin embargo para un uso simple, rápido y funcional de Robocopy nos basta con crear un archivo .bat tal que así:

@echo off
robocopy C:\Proyectos \\99.34.63.19\AM_Proyectos /E /B
robocopy C:\VBnet \\99.34.63.19\AM_VBnet /E /B
robocopy C:\2006 F:\2006 /E /B
robocopy C:\2007 F:\2007 /E /B
robocopy C:\2008 F:\2008 /E /B

Después basta con ejecutar el .bat y directamente se nos crea una copia incremental de los cinco directorios de la unidad C que hemos especificado en las cinco rutas destino que hemos indicado. Así, los dos primeros se copiarán en sus respectivas carpetas en el servidor, mientras que los otros tres irán a parar a mi pendrive USB. Los parámetros /E y /B nos permiten precisamente hacer eso.

Insisto en que es una copia incremental. Esto significa que la primera vez que se ejecuta se demora unos minutos en función de la cantidad de información a respaldar, pero las siguientes sólo copiará los ficheros modificados, con lo que en principio es bastante rápido. No borra de destino los elementos que ya no forman parte de los directorios de origen, pero es algo que también se puede configurar con el parámetro /PURGE si se desea.

Nota.

Aunque Robocopy viene con Windows Vista, se puede también añadir a sistemas Windows anteriores mediante las Windows Server 2003 Resource Kit Tools que funcionan como su propio nombre indica para Windows Server 2003 y también para Windows XP.




Creative Commons License
El blog de Albert Mata by Albert Mata is licensed under a Creative Commons Reconocimiento-Compartir bajo la misma licencia 2.5 España License.