World Map
Java Service Wrapper is the easiest way to make your product more reliable.
  • Free Trial
  • Buy Now

Problema

¿Cómo puedo tener acceso a recursos compartidos de Windows desde mi servicio Java?

Arrow

Solución!

El Java Service Wrapper tiene la capacidad de asignar unidades de red e impresoras para compartir recursos para sus servicios.

Windows permite asignar unidades de red para que usuarios tengan acceso a recursos compartidos como si fueran una unidad local. Esta función de Windows ofrece muchas ventajas que pueden ser de gran ayuda en muchas aplicaciones.

Sin embargo, uno de los problemas de Windows es la manera con la cual controla dichas unidades cuando el acceso es desde un Servicio de Windows. Cuando el servicio es iniciado manualmente, las unidades asignadas estarán disponibles pero cuando el sistema se reinicie, el servicio ya no podrá tener acceso a las unidades.

El Java Service Wrapper le ofrece una manera simple para ordenar que el servicio asigne unidades de red cuando no esten disponibles. Esto le dará la seguridad de poder tener acceso a ellas cuando lo desee.

Solución

La solución es ordenar que el servicio asigne sus propias unidades. El Java Service Wrapper ofrece una manera flexible de configurar estas propiedades, las cuales harán posible asignar unidades de red así como a impresoras. De esta manera aplicaciones Java podrán hacer uso de recursos compartidos eficazmente sin importar cuando se inicie el servicio.

En Windows, se pueden asignar unidades de red para compartir recursos como si dichas unidades fueran locales. Muchas aplicaciones hacen uso de esta función para tener acceso a archivos que son compartidos a lo largo y ancho de la red.

Sin embargo, cuando una aplicación se usa como servicio, el acceso a recursos compartidos será poco confiable. Esto se debe a que dicho acceso es potencialmente hecho solamente durante la sesión del usuario. En algunas ocasiones el acceso esta disponible dependiendo cuando se inicie el servicio y quién este en sesión en dicha máquina en ese momento.

Descripción Técnica

Compatibilidad :3.5.0
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSX (No Soportado)Linux (No Soportado)IBM AIX (No Soportado)FreeBSD (No Soportado)HP-UX (No Soportado)Solaris (No Soportado)IBM z/OS (No Soportado)IBM z/Linux (No Soportado)

Es posible configurar un Servicio de Windows y que se ejecute como una cuenta específica. Por otra parte, los recursos compartidos configurados en dicha cuenta no estarán disponibles cuando el sistema sea reiniciado. Si un usuario inicia sesión con la misma cuenta las unidades de red serán configuradas pero solo se podrán usar siempre y cuando el servicio sea completamente reiniciado.

Tradicionalmente, esto significaba que era necesario tener acceso a archivos compartidos usando UNC (Uniform Naming Convention):

\\myfileserver\commonshare\myfiles\data.txt

La sintaxis de UNC funciona con algunas aplicaciones, pero no es tan conveniente o portátil como una unidad asignada:

S:\myfiles\data.txt

Muchas aplicaciones que inicialmente no fueron diseñadas para ser ejecutadas como un Servicio de Windows y tener acceso a unidades de red no funcionarán cuando en su camino se encuentren con una ruta UNC en el archivo de configuración.

El Java Service Wrapper permite que servicios tengan acceso fácilmente a recursos compartidos al conectarse a servidores remotos e impresoras. Además ofrece un conjunto de Configuración de Propiedades para "compartir" y agregarlas al archivo de configuración del Wrapper. De esta manera se le ordernará al Wrapper que configure una o más unidades de red e impresoras antes de que la aplicación Java sea lanzada.

Asignación Simple de Recursos Compartidos Públicos

Muchas organizaciones tienen unidades compartidas que pueden ser usadas por cualquier persona que tenga acceso a la red a través de una cuenta. Es muy fácil configurar dichas unidades ya que solo se necesita asignar a una sola ubicación haciendo uso de letras (alfabeto) para indicar y asignar cada unidad.

Ejemplo de Configuración:
wrapper.share.1.location=\\miservidor\compartirunidad
wrapper.share.1.target=S:
wrapper.share.1.type=DISK
Ejemplo de Registro de Valores Asignando la Unidad "S":
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   Asignado a "S:"

Una vez que esto sea configurado la aplicación tendrá acceso a la Unidad S: de la misma manera como si fuese una unidad local. Este es un ejemplo muy simple el cual no necesita credenciales de autenticación, controlar fallas de conexión o especificar que hacer con la unidad local cuando el servicio se detenga.

Asignación de Recursos Compartidos con Autenticación

Es común que unidades de red sean protegidas y se requiera un código de acceso, además de conceder acceso a cuentas específicas. El Wrapper permite que se específique una cuenta en particular para conectarse y con la opción de asignar un código de acceso a dicha cuenta.

Ejemplo de Configuración:
wrapper.share.1.location=\\miservidor\compartirunidad
wrapper.share.1.target=S:
wrapper.share.1.type=DISK
wrapper.share.1.account=dominio\usuario
wrapper.share.1.password=Contraseña

Si la cuenta del usuario que el Wrapper este ejecutando y tiene acceso a recursos compartidos entonces no es necesario especificar una cuenta y código de acceso aún cuando el acceso a la red este restringido. Esto puede ser posible ya que Windows a menudo puede volver a usar la autenticidad de la información de la cuenta actual y conectarse a una red compartida.

Ejemplo Asignando la Unidad de Red "S":
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   Asignado a "S:"

Windows asigna letras únicas a unidades para compartir recursos y servicios. Si por alguna razón una letra de una unidad específica ya esta siendo usada por otra unidad el Wrapper automáticamente reacciona ya sea ejecutando unAPAGADO o CONTINUAR para iniciar la JVM y asignar una letra diferente para la Unidad de Red por ejemplo 'Y:'.

El Wrapper por defecto tratará un número específico de veces de conectarse a una Unidad de Red. Si la conexión no es posible ya sea por errores desconocidos o similares, los siguientes pasos a seguir son DESASIGNAR la Unidad o un APAGADO. Por otra parte, el Wrapper se asegurará que no haya archivos abiertos en ese momento antes de desconectarse para después continuar.

Controlando una Falla de Asignaciones

Cuando más de un servidor o una red estan involucrados, hay una posibilidad que algo salga mal. Si el problema es algo temporal entonces el Wrapper por defecto tratará hasta 5 veces de conectarse antes de finalmente continuar.

Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:" Intento #1. (No se puede encontrar el nombre de la red. (0x43))
...
wrapper  | Intentando asignar "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:"  Tratando de continuar. (No se puede encontrar el nombre de la red.(0x43))

Si la red compartida es crítica para la operación del servicio, lo mejor es que el Wrapper no funcione al iniciar.

Ejemplo de Configuración:
wrapper.share.1.startup.failure=SHUTDOWN
Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:" Intento #1. (No se puede encontrar el nombre de la red.(0x43))
...
wrapper  | Intentando asignar "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:" Apagando. (No se puede encontrar el nombre de la red.(0x43))
wrapper  | <-- El Wrapper se detuvo

Es posible controlar el número de veces que el Wrapper trate de asignar unidades, así como cuánto tiempo esperar entre cada intento. Tenga en mente que dichos intentos no serán efectuados a problemas permanentes.

Ejemplo de Configuración:
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10

Controlando una Asignación Compartida Previamente Configurada

Es muy común que una red compartida sea conectada con el Wrapper a una unidad que normalmente haya sido hecho por un usuario en sesión. Cuando esto pasa, es posible que el servicio sea iniciado con la unidad que ya ha sido asignada previamente.

Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   "S:" ya esta definido.  Tratando de continuar

El problema con esto es que no se puede estar 100% seguro que la unidad asignada esta en el servidor correcto. Si esto le preocupa, la mejor opción es abortar al inicio del servicio.

Ejemplo de Configuración:
wrapper.share.1.startup.premapped=SHUTDOWN
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10
Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   "S:" ya esta definido.  Apagando.
wrapper  | Abandonar la asignación "S:"
wrapper  | <-- El Wrapper se detuvo

Desasignando Durante un Apagado

Por defecto, el Wrapper dejará cualquier red compartida asignada cuando este se apague. Normalmente esta es la mejor opción ya que unidades compartidas pueden estar siendo usadas por otros usuarios o aplicaciones.

Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  | Abandonar asignación "S:" .
wrapper  | <-- El Wrapper se detuvo

En algunas ocasiones usted quiere asegurarse que la unidad sea desasignada al momento de un apagado.

Ejemplo de Configuración:
wrapper.share.1.shutdown.unmap=TRUE
Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  |  "S:" Desasignado.
wrapper  | <-- El Wrapper se detuvo

Si el recurso compartido no fue asignado a una unidad por la instancia del Wrapper en ese momento, entonces dicho recurso será usado.

Ejemplo de Registro de Valores de la Salida de Datos:
wrapper  | Abandonar la asignación "S:"
wrapper  | <-- El Wrapper se detuvo

Si existen archivos abiertos en el recurso compartido entonces el proceso para desasignar no se efectuará. La desasignación puede ser forzada si así se desea. Note que el Wrapper aún dejará el recurso compartido si este no fuese asignado a una unidad por la instancia del Wrapper en ese momento.

Ejemplo de Configuración:
wrapper.share.1.shutdown.unmap=TRUE

Asignación de Unidades de Red a Impresoras

Impresoras que son localizadas en una máquina remota pueden ser conectadas de la misma manera como se hace con una unidad. La diferencia es que el puerto de una impresora es específicado en lugar de una letra:

Ejemplo de Configuración:
wrapper.share.1.location=\\miservidor\impresora
wrapper.share.1.target=LPT2:
wrapper.share.1.type=PRINTER
Ejemplo de Registro de Valores de la Salida de Datos:
wrapper |Intentando asignar  "\\miservidor\impresora" y compartir con "LPT2:"...
wrapper |   Asignado a "LPT2:"

Posibles Problemas

Hay un considerable número de problemas muy comunes y lo más probable es que los experimente al asignar unidades de red para hacer uso de recursos compartidos.

Servidor no Localizado.

Si el servidor esta fuera de servicio o hay problemas de red entonces es posible que la conexión que se intenta hacer, no tenga éxito.

Ejemplo del Registro de Valores en Errores de Asignaciones de Unidades de Red:
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:" Intento #1. (No se puede encontrar el nombre de la red.(0x43))
...
wrapper  | Intentando asignar "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:" Apagando. (No se puede encontrar el nombre de la red.(0x43))
wrapper  | <-- El Wrapper se detuvo

Si no se especifica claramente el tipo de compartimiento a DISK entonces Windows no podrá decidir si esta tratando de conectarse a un disco o a una impresora, dicho error generará un mensaje como el que a continuación se muestra:

Ejemplo del Registro de Valores en Errores de Asignaciones de Unidades de Red:
wrapper  | Intentando asignar "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:" Tratando de continuar. (El tipo del recurso de la red no es correcto.(0x42))

Acceso Denegado

Si la cuenta configurada o código de acceso son incorrectos, entonces la asignación de unidad no será posible y recibirá un mensaje como el que a continuación se presenta. Por favor asegúrese de consultar a su administrador de sistemas para confirmar que la información de la conexión es correcta.

Ejemplo del Registro de Valores en Errores de Asignaciones de Unidades de Red:
wrapper  | Intentando asignar "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:"  Tratando de continuar. (Acceso denegado.(0x5))

Depuración

Si la asignación no esta funcionando como se desea, por favor trate de habilitar Depuración de Salida de Datos.

Ejemplo de Configuración:
wrapper.debug=TRUE

La depuración de Salida de Datos incluirá la confirmación de la configuración, además de información adicional sobre lo que el Wrapper esta tratando de hacer.

Ejemplo del Registro de Valores en Errores de Asignaciones de Unidades de Red:
wrapper  | Detalles del Mapa de Red: 
wrapper  |   Ubicación:                  \\miservidor\compartirunidad
wrapper  |   Objetivo:                   S:
wrapper  |   Cuenta:                     usuario (Contraseña: 123456)
wrapper  |   Tipo: ANY
wrapper  |   Inicio: 
wrapper  |     Al fallar:                SHUTDOWN
wrapper  |     Al Preasignar:           SHUTDOWN
wrapper  |     Reintentos Máximos:       5
wrapper  |     Intervalo de Reintentos:  10
wrapper  |   Apagando: 
wrapper  |     Desasignar:  TRUE(Fuerza: TRUE)
wrapper  | Intentando asignar  "\\miservidor\compartirunidad" y compartir con "S:"...
wrapper  |   No se puede asignar a "S:"  Tratando de continuar. (Acceso denegado.(0x5))

Referencia: Compartir Windows

Estas propriedades son usadas en combinación con otras propriedades para configurar su cuenta de Windows que es usada para ejecutar el servicio.