You are on page 1of 15

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?

name=News&file=article&sid=588

1 de 15

Inicio
Buscar
Contactar
Cookies
Descargas
Foros
Historia
Nosotros
Proponer
Temas
Top 10
Trucos
Tutoriales
Usuario
Wiki
Nick

Contrasea

Iniciar
Nuevo
usuario

English

Programacin: Cmo desarrollar una aplicacin de servicio en Windows con Visual Basic .Net

Descargar
Descarga Gratis Prueba de Velocidad Rpido con InternetSpeedTracker!

Explicamos paso a paso en este tutorial cmo realizar un servicio de Windows mediante el lenguaje de programacin Microsoft Visual Basic .Net
de Microsoft Visual Studio .Net. Mostramos cmo desarrollar una aplicacin especial: un servicio de Windows. Dicha aplicacin se integrar
perfectamente en los servicios de Microsoft Windows 7 (o cualquier otro sistema operativo de Microsoft).

Los servicios de Windows, definicin, cmo se configuran, cmo consultar su estado.


Desarrollar un servicio de Windows con VB.Net.
Propsito del servicio Windows que desarrollaremos.
Desarrollar o implementar un servicio de Windows con Visual Basic .Net.
Agregar instalador a proyecto VB.Net ServiceInstaller y ServiceProcessInstaller.
Instalar y desinstalar un servicio de Windows.
Instalar servicio de Windows desarrollado con VB.Net.
Desinstalar servicio de Windows.
Depuracin de una aplicacin de Servicio de Windows con VB.Net.
Cmo reaccionar a los sucesos de apagado y energa en nuestro servicio VB.Net.
Anexo.
Cdigo fuente o source code del servicio de ejemplo de este artculo.
Cdigo fuente de un servicio real desarrollado por AjpdSoft.
Artculos relacionados.
Crditos.

Los servicios de Windows, definicin, cmo se configuran, cmo


consultar su estado
Un servicio de Windows es una aplicacin normal con algunas pequeas variaciones. Es un programa que es iniciado por el sistema operativo en
su arranque (si as ha sido configurado). El usuario, en una situacin normal, no los inicia ni los detiene, es el sistema operativo el que realiza
estas tareas, normalmente de forma automtica.
Un servicio de Windows es una aplicacin que se ejecuta en segundo plano (background), en situaciones normales un servicio no interacta con
el usuario, no suelen mostrarse ventanas ni mensajes que el usuario pueda ver. Suelen ser aplicaciones que realizan tareas y procesos que no
requieren de la intervencin del usuario.
Un servicio de Windows se puede iniciar o detener desde la ventana de Servicios de Windows. Para el caso de Microsoft Windows 7, desde el
botn "Iniciar" - "Panel de control" - "Herramientas administrativas" - "Servicios". En esta ventana podremos ver todos los servicios instalados en
el sistema operativo y su estado (iniciados, detenidos o pausados). Pulsando con el botn derecho del ratn sobre uno de ellos y seleccionando
"Propiedades":

podremos ver las propiedades y configuracin para el servicio actual. En la pestaa "General":
Nombre de servicio: nombre con el que se identifica el servicio para tareas internas (iniciarlo o detenerlo desde la lnea de comandos,
etc.).
Nombre para mostrar: nombre que aparece en la columna "Nombre" de la ventana de servicios.
Descripcin: descripcin larga de lo que hace el servicio o la empresa que lo ha desarrollado.
Ruta de acceso al ejecutable: carpeta y fichero ejecutable (aplicacin) del servicio.
Tipo de inicio: modo en el que arrancar el servicio: Automtico (inicio retrasado), Automtico, Manual Deshabilitado.
Estado del servicio: estado actual del servicio: Iniciado, Detenido, Pausado.
Con los botones "Iniciar", "Detener", "Pausar", "Reanudar" se podr cambiar el estado del servicio.

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

2 de 15

En la pestaa "Iniciar sesin": desde esta pestaa podremos configurar las opciones de seguridad, indicando con qu usuario del equipo o del
dominio (si el equipo pertenece a un dominio Windows). Si el servicio requiere de interactuacin con el usuario (aunque no es lo habitual)
podremos marcar la opcin "Permitir que el servicio interacte con el escritorio":

En la pestaa "Recuperacin" podremos configurar las acciones a realizar en caso de que se produzca algn error en la ejecucin del servicio:
qu hacer si se produce el primer error, el segundo, si se producen ms errores:

En la pestaa "Dependencias" se mostrar si el inicio de un servicio depende de que otros servicios estn iniciados. De ser as, antes de iniciar el
servicio los servicios de los que depende deben estar iniciados. Tambin ocurre a la inversa, si otros servicios dependen de ste y lo detenemos,
tambin se detendrn los servicios que dependen de ste:

Normalmente, los servicios iniciados suelen verse en el Administrador de tareas de Windows, desde la pestaa "Procesos":

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

3 de 15

Nota: en el ejemplo que os estamos mostrando, el servicio se llama "Apache2.2" y como se puede observar, el proceso se llama "httpd.exe",
esto es porque el servicio "Apache2.2" en realidad ejecuta el fichero "httpd.exe" (como se puede observar ms atrs en "Ruta de acceso al
ejecutable").
Hay que tener en cuenta, si decidimos iniciar, detener o cambiar el modo de inicio de algunos servicios (incluso si los deshabilitamos para
impedir su arranque), que algunos servicios son necesarios para el correcto funcionamiento del sistema operativo, por lo que si cambiamos su
estado puede que ste deje de funcionar correctamente. Por lo que es recomendable no modificar el estado y tipo de inicio de estos servicios.
En el caso de que nuestro equipo vaya "lento" y pueda ser debido a que tenemos muchos servicios de aplicaciones innecesarias en ejecucin,
podremos usar la herramienta "msconfig" (Configuracin del sistema), desde el botn "Iniciar" - escribiendo "msconfig":

En la pestaa "Servicios" de "Configuracin del sistema" podremos deshabilitar los servicios que consideremos que no son necesarios. Marcando
la opcin "Ocultar todos los servicios de Microsoft" no se mostrarn los servicios del sistema operativo, por lo que evitaremos cometer posibles
errores. Hay que tener en cuenta que los servicios que desmarquemos en esta ventana cambiarn el tipo de inicio a "Deshabilitado", por lo que
no podrn ejecutarse ni tan siquiera de forma manual hasta que no volvamos a cambiar el tipo de inicio a Manual o a Automtico. Por ello hay
que proceder con precaucin o algunas aplicaciones dejarn de funcionar:

Desarrollar un servicio de Windows con VB.Net Visual Basic .Net


Propsito del servicio Windows que desarrollaremos
A continuacin vamos a explicar paso a paso cmo desarrollar un servicio para Windows. Vamos a realizar una aplicacin que ser y se integrar
como un servicio de Windows.
Vamos a desarrollar un servicio de ejemplo que permita cifrar todos los archivos contenidos en una carpeta especificada del equipo. Cada
fichero que el usuario copie en dicha carpeta ser automticamente cifrado por nuestro servicio. Utilizaremos un algoritmo de cifrado sencillo y el
componente FileSystemWatcher para recibir una notificacin cada vez que se cree un nuevo archivo en una determinada carpeta.
A continuacin vamos a explicar cmo hacer un servicio con Microsoft Visual Basic .Net 2010 (vlido para otras versiones) que, cada vez que el
usuario cree un fichero en una carpeta determinada. El servicio se iniciar de forma automtica usando FileSystemWatcher.
Este es un ejemplo cualquiera, los servicios se pueden utilizar para cualquier tarea que estimemos oportuna, con un poco de lgica, claro, no se
debe confundir el uso especfico de un sevicio con el de una aplicacin de escritorio. El servicio es una simple tarea que dotar de una utilidad
extra a otra aplicacin o para realizar tareas repetitivas y automticas, que no requiere de intervencin del usuario y que se debe ejecutar cada
cierto tiempo durante todo el da o cuando se produzca un cierto "evento" como es el caso del ejemplo de este artculo.

Desarrollar o implementar un servicio de Windows con Visual Basic .Net

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

4 de 15

Abriremos Microsoft Visual Basic .Net, pulsaremos en "Archivo" - "Nuevo proyecto":

Seleccionaremos "Visual Basic" - "Windows" en la parte izquierda de "Plantillas instaladas", en la parte derecha seleccionaremos "Servicio de
Windows". Introduciremos en nombre el identificador del proyecto, por ejemplo "AjpdSoftServicioEncriptarCarpeta" y pulsaremos "Aceptar":

Nos mostrar la superficie de diseo para el fichero "Service1.vb" que ser el principal de nuestra aplicacin de servicio de Windows:

Pulsando en el "Explorador de soluciones" podremos ver los ficheros que se han creado, renombraremos el fichero "Service1.vb" por el nombre
que queramos, por ejemplo "EncriptarCarpeta.vb":

Agregaremos ahora el componente que nos permitir saber cundo el usuario ha creado un nuevo fichero en la carpeta especificada. Este
componente ser el que "active" nuestra aplicacin para que encripte el nuevo fichero. Para agregar este componente pulsaremos en el Cuadro
de herramientas, en "Componentes" - "FileSystemWatcher" (realiza el seguimiento de las notificaciones de cambio del sistema de archivos y
desencadena eventos cuando cambia un directorio o archivo):

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

5 de 15

El componente FileSystemWatcher quedar agregado:

Estableceremos ahora las propiedades del servicio que estamos desarrollando. Para ello pulsaremos con el botn derecho sobre la superficie de
diseo y seleccionaremos "Propiedades":

Las propiedades disponibles para nuestra aplicacin servicio de Windows son:


Name: nombre del servicio (System.ServiceProcess.ServiceBase) para uso en el cdigo de nuestra aplicacin.
AutoLog: si establecemos esta propiedad a True, el servicio escribir entradas de forma automtica en el registro de sucesos "Aplicacin"
de Windows, en las siguientes situaciones: cuando el servicio se inicia y se detiene con xito, cuando se detiene de forma temporal (pausa)
y se reaunda con xito y, finalmente, cuando algn comando no se ejecuta correctamente. Los mensajes enviados al registro de sucesos de
Windows son ms bien genricos, del tipo "El servicio se ha iniciado con xito" y no tendr control sobre su contenido, pero resultan
adecuados en la mayora de los casos y de gran utilidad, especialmente durante la fase de depuracin de la aplicacin.
CanHandlePowerEvent: indica si el servicio puede controlar notificaciones de los cambios de estado de la alimentacin del equipo.
CanHandleSessionChangeEvent: indica si el servicio puede controlar eventos de cambio de sesin recibidos de una sesin de Terminal
Server.
CanPauseAndContinue: indica si se puede pausar y reanudar el servicio.
CanShutdown: indica si se debe informar al servicio de que el sistema se est cerrando.
CanStop: indica si puede detenerse el servicio una vez se ha iniciado.
ExitCode: obtiene o establece el cdigo de salida para el servicio.
Language: lenguaje de la aplicacin de servicio.
Localizable: determina si se va a generar cdigo traducible para este objeto.
ServiceName: nombre que identificar el servicio en el sistema Windows. Ser el nombre que se establezca para el servicio en Windows.

Indicamos tambin a continuacin las propiedades para el componente FileSystemWatcher anteriormente agregado:
Name: nombre identificativo para el componente para uso en el cdigo, por ejemplo "cambioFicheroCarpeta".

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

6 de 15

EnableRaisingEvents: indica si el componente est habilitado, lo pondremosa False para que el componente no provoque sucesos antes
de que se inicie el servicio.
Filter: cadena de filtro utilizada para determinar qu archivos se supervisan en un directorio.
GenerateMember: indica si se generar una variable miembro para este componente.
IncludeSubdirectories: indica si se deben supervisar los subdirectorios de la ruta de acceso especificada.
Modifiers: indica el nivel de visibilidad del objeto.
NotifyFilter: establece el tipo de cambios que se van a inspeccionar.
Path: establece la ruta de acceso del directorio que se va a inspeccionar.

El servicio leer la carpeta que usar para comprimir los archivos de un fichero de configuracin INI. De esta forma el usuario podr indicar qu
carpeta quiere usar. Para ello aadiremos una clase a nuestro proyecto VB.Net que nos permitir leer valores de configuracin de ficheros INI.
Para aadir esta clase pulsaremos en el "Explorador de soluciones", pulsaremos con el botn derecho sobre el proyecto y seleccionaremos
"Agregar" - "Clase":

Introduciremos un nombre para la clase, por ejemplo "LeerEscribirFicherosINI.vb":

Copiaremos y pegaremos el cdigo de este enlace (contenido de la clase para trabajar con ficheros INI) en el fichero de clase creado
"LeerEscribirFicherosINI": Funciones para leer y escribir en ficheros INI VB.Net:

Aadiremos ahora el cdigo VB.Net necesario para activar el componente FileSystemWatcher cuando se inicie el servicio, en el evento "OnStart"
del fichero "EncriptarCarpeta.vb":
Protected Overrides Sub OnStart(ByVal args() As String)
Dim carpetaCifrar As String
'Leemos la carpeta a cifrar del fichero INI de configuracin
Dim objFicherosINI As New LeerEscribirFicherosINI(
System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
"configuracion.ini"))
carpetaCifrar = objFicherosINI.GetString("Configuracin", "Carpeta",
System.AppDomain.CurrentDomain.BaseDirectory)
'Comprobamos que el directorio a encriptar existe
'Si no existe lo creamos
If Not System.IO.Directory.Exists(carpetaCifrar) Then
System.IO.Directory.CreateDirectory(carpetaCifrar)
End If
'Activamos la recepcin de sucesos de archivos
cambioFicheroCarpeta.Path = carpetaCifrar

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

7 de 15

cambioFicheroCarpeta.EnableRaisingEvents = True
End Sub

Aadiremos ahora el cdigo VB.Net necesario para desactivar el componente FileSystemWatcher cuando se detenga el servicio, en el evento
"OnStop" del fichero "EncriptarCarpeta.vb":
Protected Overrides Sub OnStop()
'Detenemos la recepcin de sucesos de archivos
cambioFicheroCarpeta.EnableRaisingEvents = False
End Sub

Introduciremos ahora el cdigo VB.Net necesario para cifrar los ficheros que el usuario vaya creando o copiando a la carpeta establecida en el
fichero de configuracin INI. Por un lado declararemos una variable para establecer la contrasea de cifrado y la extensin de los ficheros
temporales que se crearn para el cifrado:
Public Class EncriptarCarpeta
Dim clavesCifrado() As Byte = {234, 125, 22, 6, 54, 45, 254}
Dim extensionFicherosTMP As String = ".###"

Crearemos los procedimientos necesarios para el cifrado de los ficheros:


Private Sub encritarFicheros(ByVal nombreFichero As String,
ByVal clavesCifrado() As Byte)
'tamao de cada bloque de entrada,
'el tamao para descrifrar deber ser igual
Const tamanoBloque = 8192
'nombre del fichero temporal que se crear para el cifrado
Dim ficheroTemporal As String = nombreFichero & extensionFicherosTMP
'abrimos el archivo origen como una secuencia binaria de entrada
Dim entradaStr As New System.IO.FileStream(nombreFichero, IO.FileMode.Open)
'abrimos el archivo temporal de salida como una secuencia binaria de entrada
Dim salidaStr As New System.IO.FileStream(ficheroTemporal, IO.FileMode.Create)
'determinar el nmero de bytes que se desean leer
Dim tamanoBytes As Long = entradaStr.Length
'preparar un bfer de entrada
Dim buffer(tamanoBloque - 1) As Byte
'mientras que haya bytes que leer
Do While tamanoBytes > 0
'lectura mxima de 8kb por bloque
Dim bytesLeer As Long = Math.Min(tamanoBloque, tamanoBytes)
'leer dentro del bfer de entrada
entradaStr.Read(buffer, 0, bytesLeer)
'cifrar este bfer
encritarArray(buffer, clavesCifrado)
'enviar la salida a un archivo temporal
salidaStr.Write(buffer, 0, bytesLeer)
tamanoBytes -= bytesLeer
Loop
'cerrar las dos secuencias
entradaStr.Close()
salidaStr.Close()
'eliminar el archivo de origen
System.IO.File.Delete(nombreFichero)
'renombrar el archivo temporal como el original
System.IO.File.Move(ficheroTemporal, nombreFichero)
End Sub
'Cifrar con xor una matriz de bytes
Sub encritarArray(ByVal buffer() As Byte, ByVal pwBytes() As Byte)
'ndice que apunta al bfer
Dim indice As Integer
'ndice que apunta a la matriz de contraseas
Dim i As Integer
'valor mximo de i
Dim maximo As Integer = pwBytes.Length
For indice = 0 To buffer.Length - 1
'hacer un XOR de cada elemento contenido en el bfer con
'el correspondiente elemento de contrasea
buffer(indice) = buffer(indice) Xor pwBytes(i)
'comprobar que el ndice corresponde siempre al rango vlido
i = (i + 1) Mod maximo
Next
End Sub

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

8 de 15

En el evento OnCreated del FileSystemWatcher aadiremos el siguiente cdigo VB.Net:


Private Sub cambioFicheroCarpeta_Created(sender As System.Object, _
e As System.IO.FileSystemEventArgs) _
Handles cambioFicheroCarpeta.Created
Dim carpetaCifrar As String
'Leemos la carpeta a cifrar del fichero INI de configuracin
Dim objFicherosINI As New LeerEscribirFicherosINI(
System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
"configuracion.ini"))
carpetaCifrar = objFicherosINI.GetString("Configuracin", "Carpeta",
System.AppDomain.CurrentDomain.BaseDirectory)
If System.IO.Path.GetExtension(carpetaCifrar) <> extensionFicherosTMP Then
encritarFicheros(carpetaCifrar, clavesCifrado)
End If
End Sub

Agregar instalador a proyecto VB.Net ServiceInstaller y ServiceProcessInstaller


Los servicios de Windows no se pueden iniciar como una aplicacin normal. En primer lugar, para iniciar un servicio de Windows, deberemos
instalarlo en el equipo en el que queramos ejecutarlo y, a continuacin, podremos iniciarlo mediante el complemento Servicios (services.msc) o
bien desde la lnea de comandos usando NET START.
En el caso de Microsoft Visual Basic .Net, el primer paso para poder instalar el servicio es agregar una clase instaladora. Esta clase puede ser
instalada o bien usando la herramienta automtica de la que dispone Microsoft Visual Studio .Net o bien creando manualmente la clase
instaladora mediante cdigo.
El primer mtodo es el ms sencillo y se adapta a casi todas las situaciones normales de un servicio. Para usarlo accederemos a la ventana de
diseo de nuestra aplicacin de servicio (EncriptarCarpeta.vb [Diseo]), en esta pestaa pulsaremos con el botn derecho del ratn en cualquier
parte donde no haya elementos, nos mostrar un mensaje emergente, seleccionaremos "Agregar instalador":

Visual Basic .Net aadir un nuevo componente a la aplicacin de servicio llamado ProjectInstaller.vb, en este nuevo componente habr
aadido dos objetos adicionales: ServiceProcessInstaller1 y ServiceInstaller1. Pulsando con el botn derecho del ratn sobre
ServiceInstaller1 y seleccionando "Propiedades" podremos establecer las propiedades para el servicio que se instalar, las ms importantes:
ServiceName: esta propiedad debe coincidir con la propiedad ServiceName de la clase servicio que hemos configurado inicialmente, en
nuestro caso AjpdSoftEncriptarFicheros.
DisplayName: cadena de texto descriptiva del servicio, por ejemplo indicando lo que hace: "Encripta los ficheros de la carpeta indicada en
el fichero de configuracin". Este texto aparecer en el programa complementario MMC denominado Servicios (services.msc).
StartType: tipo de inicio del servicio, las posibilidades son: automtico, manual o deshabilitado. En nuestro caso seleccionaremos

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

9 de 15

"Automatic" para que el servicio se inicie de forma automtica cada vez que arranquemos el equipo.
ServicesDependedOn: si nuestro servicio depende de otros servicios para poder ser iniciado, es decir, si para iniciar nuestro servicio debe
haber otros iniciados los podremos indicar aqu.

Para configurar el contexto de seguridad del servicio pulsaremos con el botn derecho del ratn sobre "ServiceProcessInstaller1",
seleccionaremos "Propiedades". Desde esta ventana de propiedades podremos indicar el tipo de cuenta en "Account" con las posibilidades:
LocalService: cuenta que acta como usuario sin privilegios en el equipo local y presenta credenciales annimas a cualquier servidor
remoto.
NetworkService: cuenta que proporciona amplis privilegios locales y presenta credenciales del equipo a cualquier servidor remoto.
LocalSystem: una cuenta, utilizada por el administrador de control de servicio, que tiene amplios privilegios en el equipo local y funciona
como un equipo de la red.
User: cuenta definida por un usuario especfico en la red. Si se especifica User para el miembro ServiceProcessInstaller.Account, el sistema
pide un nombre de usuario y una contrasea al instalar el servicio, a menos que se establezcan valores para las propiedades Username y
Password de la instancia de ServiceProcessInstaller.

Generar ejecutable de servicio en Visual Basic .Net


Generaremos el ejecutable del servicio para poder instalarlo postieriormente, para ello en el IDE de Visual Basic .Net pulsaremos en el men
"Generar" - "Generar AjpdSoftServicioEncriptarCarpeta":

Si no hay errores de compilacin VB.Net habr creado el fichero ejecutable de nuestro servicio Windows en la carpeta bin del proyecto:

Crearemos el fichero de configuracin INI para indicar la carpeta a encritar, para ello abriremos el notepad (bloc de notas) de Windows o
cualquier otro editor de texto plano y escribiremos el siguiente contenido:
[Configuracin]
Carpeta=C:/encriptar

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

10 de 15

Guardaremos el fichero con el nombre "configuracion.ini" en la misma carpeta que el ejecutable del servicio:

Copiaremos el ejecutable AjpdSoftServicioEncriptarCarpeta.exe y el fichero configuracion.ini a una carpeta de la unidad C para facilitar la
instalacin del servicio (para evitar rutas largas). Por ejemplo los copiaremos a la carpeta:
C:/ServicioEncriptar

Instalar y desinstalar un servicio de Windows


Instalar servicio de Windows desarrollado con VB.Net
Para instalar el servicio desarrollado anteriormente con VB.Net usaremos la herramienta que incorpora .Net Framework llamada InstallUtil, dicha
herramienta suele estar ubicada en:
C:/Windows/Microsoft.NET/Framework/v.xxxxx/InstallUtil.exe
donde v.xxxxx es la versin de .Net Framework que tengamos instalada en el equipo.
Abriremos una ventana de MS-DOS de la lnea de comandos como administrador, para ello pulsaremos en el botn "Iniciar" - "Accesorios", sobre
"Smbolo del sistema" pulsaremos con el botn derecho del ratn y seleccionaremos "Ejecutar como administrador":

Desde la lnea de comandos accederemos a la carpeta donde se encuentra el fichero InstallUtil.exe, con el comando "cd":
cd c:/Windows/Microsoft.NET/Framework/v4.0.30319

Para instalar el servicio desarrollado ejecutaremos el siguiente comando:


installutil C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe
Si todo es correcto devolver:
La fase de confirmacin finaliz correctamente.
La instalacin con transacciones ha finalizado.

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

11 de 15

A continuacin el listado de los mensajes devueltos tras la instalacin del servicio de Windows por InstallUtil:
cd c:/Windows/Microsoft.NET/Framework/v4.0.30319
installutil C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe
Utilidad de instalacin de Microsoft (R) .NET Framework, versin 4.0.30319.1
(C) Microsoft Corporation. Reservados todos los derechos.
Ejecutando una instalacin de transaccin.
Iniciando la fase de instalacin dentro de la instalacin.
Consulte el contenido del archivo de registro sobre el progreso del ensamblado C:/ServicioEncriptar
/AjpdSoftServicioEncriptarCarpeta.exe.
El archivo est ubicado en C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.InstallLog.
Instalando ensamblado 'C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe'.
Los parmetros afectados son:
logtoconsole =
logfile = C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.InstallLog
assemblypath = C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe
Instalando el servicio AjpdSoftEncriptarFicheros...
El servicio AjpdSoftEncriptarFicheros se ha instalado correctamente.
Creando el origen de EventLog AjpdSoftEncriptarFicheros en el registro Application...
La fase de instalacin finaliz correctamente y la fase de confirmacin est empezando.
Consulte el contenido del archivo de registro sobre el progreso del ensamblado C:/ServicioEncriptar
/AjpdSoftServicioEncriptarCarpeta.exe.
El archivo est ubicado en C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.InstallLog.
Confirmando ensamblado 'C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe'.
Los parmetros afectados son:
logtoconsole =
logfile = C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.InstallLog
assemblypath = C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe
La fase de confirmacin finaliz correctamente.
La instalacin con transacciones ha finalizado.
Si todo es correcto podremos consultar el servicio en el "Panel de Control" - "Herramientas administrativas" - "Servicios":

Nos aparecer un nuevo servicio con el nombre "AjpdSoft Encriptar Ficheros", inicialmente en estado detenido. Haciendo doble clic sobre l
podremos ver las propiedades:

El nombre del servicio ser: AjpdSoftEncriptarFicheros, el nombre para mostrar: "AjpdSoft Encritpar Ficheros", la descripcin: "Encripta los
ficheros de la carpeta especificada", el tipo de inicio "Automtico". Pulsaremos "Iniciar" para activar la aplicacin de servicio y as poder probarlo:

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

12 de 15

Desinstalar servicio de Windows


Si queremos desinstalar el servicio ejecutaremos el siguiente comando:
installutil "C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe" /u

A continuacin el listado de los mensajes devueltos tras la desinstalacin del servicio de Windows por InstallUtil:

installutil C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe /u
Utilidad de instalacin de Microsoft (R) .NET Framework, versin 4.0.30319.1
(C) Microsoft Corporation. Reservados todos los derechos.
Iniciando la desinstalacin.
Consulte el contenido del archivo de registro sobre el progreso del ensamblado C:/ServicioEncriptar
/AjpdSoftServicioEncriptarCarpeta.exe.
El archivo est ubicado en C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.InstallLog.
Desinstalando ensamblado 'C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe'.
Los parmetros afectados son:
logtoconsole =
logfile = C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.InstallLog
assemblypath = C:/ServicioEncriptar/AjpdSoftServicioEncriptarCarpeta.exe
Quitando el origen de EventLog AjpdSoftEncriptarFicheros.
Se est quitando el servicio AjpdSoftEncriptarFicheros del sistema...
El servicio AjpdSoftEncriptarFicheros se ha quitado correctamente del sistema.
La desinstalacin ha finalizado.

Depuracin de una aplicacin de Servicio de Windows con VB.Net


Si la aplicacin de servicio con VB.Net produce algn error no controlado por nosotros, ser escrito automticamente en el visor de eventos de
Windows. Desde "Inicio" - "Panel de Control" - "Herramientas administrativas" - "Visor de eventos", en "Registros de Windows" - "Aplicacin"
podremos ver los posibles errores de nuestro servicio:

Si queremos realizar una depuracin ms a fondo, por ejemplo para saber cundo nuestra aplicacin de servicio encripta un fichero, deberemos
escribir nosotros mismos en el visor de eventos. Para ello aadiremos la siguiente lnea donde y cuando queramos que la aplicacin escriba en el
visor de eventos:
Me.EventLog.WriteEntry("Encriptando fichero...")
Podemos controlar los posibles errores de nuestra aplicacin y guardar el error que se pueda producir en el Visor de eventos. Para ello, en el
cdigo propenso a producir algn error, aadiramos:
Try
...........
Catch ex As Exception
Me.EventLog.WriteEntry("Error al encriptar: " & ex.Message)
End Try

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

13 de 15

Por supuesto, otra opcin para depurar nuestra aplicacin de servicio es escribir los eventos que queramos registrar en un fichero de log (fichero
de texto plano). De esta forma no necesitaremos escribir en el Visor de eventos y ser ms sencillo consultar y depurar posibles errores. Un
procedimiento para escribir en un fichero de log:
Private Sub escribirLog(texto As String)
Dim fichero As New System.IO.StreamWriter("c:\encriptar.log", True)
fichero.WriteLine(Now & Chr(9) & texto)
fichero.Close()
End Sub

Un ejemplo de uso de este procedimiento:


escribirLog("Leyendo carpeta a cifrar de fichero INI")

Cmo reaccionar a los sucesos de apagado y energa en nuestro


servicio VB.Net
La mayora de las aplicaciones de servicio suelen disponer de cdigo de limpieza en sus mtodos OnStop y OnPause para que el servicio no
consuma recursos cuando no se encuentre en ejecucin. En algunos casos, ser conveniente ejecutar cdigo especial cuando se apague el
sistema o cuando el sistema entre en modo suspensin u otro sucesos relacionado con la alimentacin de energa.
Por ejemplo, para ejecutar cdigo cuando se apague el sistema realizaremos los siguientes pasos:
1. Pulsaremos con el botn derecho del ratn sobre el diseador del servicio y seleccionaremos "Propiedades":

2. Cambiaremos el valor de la propiedad "OnShutdown" a True en la ventana de propiedades del servicio:

3. Aadiremos el siguiente procedimiento para cuando se produzca el evento de apagado del sistema "OnShutdown", en este procedimiento
pondremos el cdigo que queramos que se ejecute cuando se vaya a apagar el equipo:
Protected Overrides Sub OnShutdown()
cambioFicheroCarpeta.EnableRaisingEvents = False
escribirLog("El equipo se est apagando")
End Sub

De la misma forma podremos activar la propiedad "CanHandlePowerEvent" del servicio a True y usaremos el procedimiento "OnPwerEvent" como
se indica a continuacin:
Protected Overrides Function OnPowerEvent(powerStatus As _
System.ServiceProcess.PowerBroadcastStatus) As Boolean
Select Case powerStatus
Case ServiceProcess.PowerBroadcastStatus.Suspend
escribirLog("El equipo se est suspendiendo")
Case ServiceProcess.PowerBroadcastStatus.ResumeSuspend
escribirLog("El equipo se est saliendo del modo suspensin")
Case ServiceProcess.PowerBroadcastStatus.BatteryLow
escribirLog("El equipo tiene la batera baja")
End Select
Return True
End Function

Anexo
Cdigo fuente o source code del servicio de ejemplo de este artculo
Public Class EncriptarCarpeta
Dim clavesCifrado() As Byte = {234, 125, 22, 6, 54, 45, 254}
Dim extensionFicherosTMP As String = ".###"
Protected Overrides Sub OnShutdown()
cambioFicheroCarpeta.EnableRaisingEvents = False
escribirLog("El equipo se est apagando")
End Sub
Protected Overrides Function OnPowerEvent(powerStatus As _
System.ServiceProcess.PowerBroadcastStatus) As Boolean

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

14 de 15

Select Case powerStatus


Case ServiceProcess.PowerBroadcastStatus.Suspend
escribirLog("El equipo se est suspendiendo")
Case ServiceProcess.PowerBroadcastStatus.ResumeSuspend
escribirLog("El equipo se est saliendo del modo suspensin")
Case ServiceProcess.PowerBroadcastStatus.BatteryLow
escribirLog("El equipo tiene la batera baja")
End Select
Return True
End Function
Private Sub escribirLog(texto As String)
Dim fichero As New System.IO.StreamWriter("c:\encriptar.log", True)
fichero.WriteLine(Now & Chr(9) & texto)
fichero.Close()
End Sub
Protected Overrides Sub OnStart(ByVal args() As String)
Dim carpetaCifrar As String
escribirLog("Leyendo carpeta a cifrar de fichero INI")
'Leemos la carpeta a cifrar del fichero INI de configuracin
Dim objFicherosINI As New LeerEscribirFicherosINI(
System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
"configuracion.ini"))
carpetaCifrar = objFicherosINI.GetString("Configuracin", "Carpeta",
System.AppDomain.CurrentDomain.BaseDirectory)
escribirLog("Carpeta a cifrar: " & carpetaCifrar)
'Comprobamos que el directorio a encriptar existe
'Si no existe lo creamos
If Not System.IO.Directory.Exists(carpetaCifrar) Then
System.IO.Directory.CreateDirectory(carpetaCifrar)
escribirLog("Carpeta a cifrar no existente, se ha creado")
End If
'Activamos la recepcin de sucesos de archivos
cambioFicheroCarpeta.Path = carpetaCifrar
cambioFicheroCarpeta.EnableRaisingEvents = True
escribirLog("Activada la recepcin de sucesos de archivos")
End Sub
Protected Overrides Sub OnStop()
'Detenemos la recepcin de sucesos de archivos
cambioFicheroCarpeta.EnableRaisingEvents = False
escribirLog("Detenida la recepcin de sucesos de archivos")
End Sub
Private Sub cambioFicheroCarpeta_Created(sender As System.Object, _
e As System.IO.FileSystemEventArgs) _
Handles cambioFicheroCarpeta.Created
Dim carpetaCifrar As String
escribirLog("Obtenemos carpeta a cifrar para activar el monitor de cambios")
'Leemos la carpeta a cifrar del fichero INI de configuracin
Dim objFicherosINI As New LeerEscribirFicherosINI(
System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
"configuracion.ini"))
carpetaCifrar = objFicherosINI.GetString("Configuracin", "Carpeta",
System.AppDomain.CurrentDomain.BaseDirectory)
If System.IO.Path.GetExtension(carpetaCifrar) <> extensionFicherosTMP Then
encritarFicheros(carpetaCifrar, clavesCifrado)
End If
End Sub
Private Sub encritarFicheros(ByVal nombreFichero As String, ByVal clavesCifrado() As Byte)
Me.EventLog.WriteEntry("Encriptando fichero: " & nombreFichero)
Try
escribirLog("Encriptando fichero " & nombreFichero)
'tamao de cada bloque de entrada, el tamao para descrifrar deber ser igual
Const tamanoBloque = 8192
'nombre del fichero temporal que se crear para el cifrado
Dim ficheroTemporal As String = nombreFichero & extensionFicherosTMP
'abrimos el archivo origen como una secuencia binaria de entrada
Dim entradaStr As New System.IO.FileStream(nombreFichero, IO.FileMode.Open)
'abrimos el archivo temporal de salida como una secuencia binaria de entrada
Dim salidaStr As New System.IO.FileStream(ficheroTemporal, IO.FileMode.Create)
'determinar el nmero de bytes que se desean leer
Dim tamanoBytes As Long = entradaStr.Length
'preparar un bfer de entrada
Dim buffer(tamanoBloque - 1) As Byte
'mientras que haya bytes que leer
Do While tamanoBytes > 0
'lectura mxima de 8kb por bloque
Dim bytesLeer As Long = Math.Min(tamanoBloque, tamanoBytes)
'leer dentro del bfer de entrada
entradaStr.Read(buffer, 0, bytesLeer)
'cifrar este bfer
encritarArray(buffer, clavesCifrado)
'enviar la salida a un archivo temporal
salidaStr.Write(buffer, 0, bytesLeer)
tamanoBytes -= bytesLeer
Loop
'cerrar las dos secuencias
entradaStr.Close()
salidaStr.Close()
'eliminar el archivo de origen
System.IO.File.Delete(nombreFichero)
'renombrar el archivo temporal como el original
System.IO.File.Move(ficheroTemporal, nombreFichero)
escribirLog("Encriptado fichero " & nombreFichero)
Me.EventLog.WriteEntry("Encriptado fichero: " & nombreFichero)
Catch ex As Exception
Me.EventLog.WriteEntry("Error al encriptar: " & ex.Message)
escribirLog("Error al encriptar fichero " & nombreFichero & " " & ex.Message)
End Try
End Sub
'Cifrar con xor una matriz de bytes
Sub encritarArray(ByVal buffer() As Byte, ByVal pwBytes() As Byte)
'ndice que apunta al bfer
Dim indice As Integer
'ndice que apunta a la matriz de contraseas
Dim i As Integer
'valor mximo de i
Dim maximo As Integer = pwBytes.Length
For indice = 0 To buffer.Length - 1
'hacer un XOR de cada elemento contenido en el bfer con
'el correspondiente elemento de contrasea
buffer(indice) = buffer(indice) Xor pwBytes(i)

15/07/2015 22:44

Cmo desarrollar una aplicacin de servicio en Windows con Visual B... http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=588

15 de 15

'comprobar que el ndice corresponde siempre al rango vlido


i = (i + 1) Mod maximo
Next
End Sub
End Class

Artculos relacionados
Cmo desarrollar un servicio de Windows con Borland Delphi.
Generar y leer cdigos QR Quick Response Barcode con Visual Basic .Net VB.Net.
Socket Visual Basic .Net, conexin mediante socket VB.Net y System.Net.Sockets.
Desarrollar aplicacin VB.Net con componentes enlazados a MySQL de forma nativa.
El control de errores en Visual Basic .Net.
Cmo capturar errores genricos excepciones en Borland Codegear Delphi.
AjpdSoft Generador y Lector cdigos QR VB.Net.
AjpdSoft Socket VB.Net.
AjpdSoft Envo SMS Visual Basic .Net.
AjpdSoft Insertar Evento Google Calendar.
AjpdSoft Envo EMail SSL VB.Net.
AjpdSoft Conexin BD Visual Basic .Net.
AjpdSoft Ejecutar comando MS-DOS y capturar la salida.
Foro del Proyecto AjpdSoft sobre Visual Basic, Visual Studio .Net, VB.Net.
Cdigo fuente gratuito de aplicaciones completas en Delphi y Visual Basic.
Foro del Proyecto AjpdSoft sobre las aplicaciones de AjpdSoft (dudas, errores, sugerencias).

Crditos
Artculo realizado ntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.
Artculo en ingls.

Anuncios

Enviado el Tuesday, 10 April a las 23:39:12 por ajpdsoft


Este sitio web NO CONTIENE malware, todos los programas con cdigo fuente aqu. Autor: Alonso Javier Prez Daz Google+ Sguenos en Google+

15/07/2015 22:44

You might also like