Windows permet de mapper des lecteurs de serveurs réseau vers des lettres de lecteurs locaux afin qu'ils puissent être accessibles par les utilisateurs comme s'il s'agissait d'un lecteur local. Il s'agit d'une fonctionnalité très puissante de Windows, dont de nombreuses applications tirent parti.

Le problème, cependant, est que Windows n'est pas très cohérent quant à la façon dont il gère ces lecteurs mappés lorsqu'ils sont accessibles depuis un service Windows. Lorsque le service est démarré manuellement, les lecteurs seront disponibles, mais lorsque le système est redémarré, le service ne pourra plus y accéder.

Le Java Service Wrapper fournit un moyen simple d'indiquer au service de mapper lui-même les lecteurs réseau lorsqu'ils ne sont pas disponibles. Cela signifie qu'ils peuvent être accessibles de manière fiable à tout moment.

Solution

La solution consiste à donner au service la capacité de mapper ses propres lecteurs. Le Java Service Wrapper fournit un ensemble flexible de propriétés qui permettent de mapper des lecteurs réseau ainsi que des imprimantes au démarrage. Ainsi, les applications Java pourront utiliser de manière fiable ces partages, quel que soit le moment où le service est démarré.

Sous Windows, les partages réseau peuvent être mappés vers des lettres de lecteurs afin d'y accéder comme s'il s'agissait de lecteurs locaux. De nombreuses applications utilisent cette capacité pour accéder de manière transparente aux fichiers partagés sur le réseau.

Cependant, lorsqu'une telle application est convertie en service, l'accès aux lecteurs mappés devient peu fiable, car le mappage n'est potentiellement effectué que dans la session de l'utilisateur. Ils sont disponibles dans certains cas mais pas dans d'autres, selon le moment où le service est démarré, et selon qui était connecté à la machine à ce moment-là.

Aperçu technique

Compatibilité :3.5.0
Éditions :Édition ProfessionnelleÉdition StandardÉdition Community (non prise en charge)
Plateformes :WindowsMac OSX (Non pris en charge)Linux (Non pris en charge)Alpine Linux (Non pris en charge)FreeBSD (Non pris en charge)Solaris (Non pris en charge)IBM z/Linux (Non pris en charge)

Il est possible de configurer un service Windows pour qu'il s'exécute sous un compte spécifique. Cependant, les lecteurs mappés configurés dans ce compte ne seront pas disponibles lors du premier démarrage du système, et ne seront donc pas disponibles pour le service. Si un utilisateur se connecte avec le même compte, les lecteurs seront alors configurés, mais ils ne seront toujours pas disponibles pour le service, sauf s'il est complètement redémarré.

Traditionnellement, cela signifiait qu'il était nécessaire d'accéder aux fichiers sur le réseau en utilisant la UNC (Uniform Naming Convention) :

\\myfileserver\commonshare\myfiles\data.txt

Cette syntaxe UNC fonctionne avec certaines applications, mais elle n'est pas aussi pratique ni aussi portable qu'un lecteur mappé :

S:\myfiles\data.txt

De nombreuses applications qui n'étaient pas conçues à l'origine pour s'exécuter en tant que service Windows, ou qui accèdent à des lecteurs réseau, échoueront lorsqu'elles rencontreront un chemin UNC dans un fichier de configuration.

Le Java Service Wrapper facilite l'accès des services aux ressources partagées. Avec seulement un ensemble de propriétés « share », vous pouvez facilement configurer des mappages vers des emplacements distants ou des imprimantes et les rendre disponibles pour le compte en cours d'exécution, avant le lancement de l'application Java.

Mappage simple d'un partage public

De nombreuses organisations disposent de lecteurs partagés communs qui peuvent être utilisés par toute personne ayant accès au réseau via un compte invité. Ce sont de loin les plus faciles à configurer car ils ne nécessitent qu'un emplacement à mapper, et la lettre de lecteur (lettre de l'alphabet indiquant un lecteur) vers laquelle le mapper.

Exemple de configuration :
wrapper.share.1.location=\\myfileserver\commonshare
wrapper.share.1.target=S:
wrapper.share.1.type=DISK
Exemple de journal de mappage vers le lecteur « S » :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  | Mapped "S:".

Une fois cela configuré, l'application pourra accéder au lecteur S: de la même manière que n'importe quel autre lecteur local. Il s'agit d'un exemple très simple qui ne fournit aucun identifiant d'authentification, ne gère pas les échecs de connexion et ne spécifie pas ce qu'il faut faire du lecteur mappé lorsque le service s'arrête.

Mappage d'un partage public avec authentification

Il est courant que les lecteurs réseau soient protégés par un mot de passe, et que l'accès ne soit accordé qu'à des comptes spécifiques. Le Wrapper permet de spécifier un compte particulier pour se connecter et éventuellement d'attribuer un mot de passe au compte.

Exemple de configuration :
wrapper.share.1.location=\\myfileserver\commonshare
wrapper.share.1.target=S:
wrapper.share.1.type=DISK
wrapper.share.1.account=domain\user
wrapper.share.1.password=password

Si le compte utilisateur sous lequel le Wrapper s'exécute a accès au réseau partagé, il n'est alors peut-être pas nécessaire de spécifier un compte et un mot de passe, même si l'accès au réseau est restreint. Cela est possible car Windows est souvent capable de réutiliser les informations d'authentification du compte actuel lors de la connexion au réseau partagé.

Exemple de mappage vers le lecteur « S » :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  | Mapped "S:".

Windows attribue des lettres uniques aux lecteurs pour mapper les ressources et les services. Si, pour une raison quelconque, une lettre de lecteur est déjà utilisée, le Wrapper réagit automatiquement soit en s'arrêtant (SHUTDOWN) soit en continuant (CONTINUE) à démarrer la JVM et en attribuant une lettre de lecteur réseau « Y: » différente.

Par défaut, le Wrapper tentera un certain nombre de fois de se connecter à un lecteur réseau. Si cela n'est pas possible en raison d'erreurs inconnues ou similaires, les options à suivre sont de UNMAP le lecteur ou de SHUTDOWN. D'autre part, le Wrapper s'assure qu'il n'y a pas de fichiers ouverts à ce moment-là avant de se déconnecter, puis continue.

Gestion d'un échec de mappage

Chaque fois que plus d'un serveur ou qu'un réseau est impliqué, il y a une chance que quelque chose se passe mal. Si le problème est temporaire, alors le Wrapper tentera par défaut jusqu'à 5 fois de se connecter avant de finalement continuer.

Exemple de journal de sortie :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Attempt #1 (The network name cannot be found. (0x43))
...
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (The network name cannot be found. (0x43))

Mais si le partage réseau est essentiel au fonctionnement du service, vous pouvez alors souhaiter que le Wrapper échoue au démarrage.

Exemple de configuration :
wrapper.share.1.startup.failure=SHUTDOWN
Exemple de journal de sortie :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Attempt #1 (The network name cannot be found. (0x43))
...
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Shutting down. (The network name cannot be found. (0x43))
wrapper  | <-- Wrapper Stopped

Il est possible de contrôler combien de fois le Wrapper réessaie le mappage, ainsi que combien de temps attendre entre chaque tentative. Notez que les nouvelles tentatives ne seront pas effectuées pour les problèmes permanents.

Exemple de configuration :
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10

Gestion d'un partage déjà mappé

Il est assez courant qu'un partage réseau soit mappé avec le Wrapper vers un lecteur qui est normalement mappé par un utilisateur connecté. Lorsque cela se produit, il est possible que le service soit démarré avec le lecteur déjà mappé.

Exemple de journal de sortie :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   "S:" is already defined.  Trying to continue

Le problème est que vous ne pouvez pas être sûr à 100 % que le lecteur est mappé vers le bon serveur. Si cette préoccupation pose problème, vous pouvez souhaiter interrompre le démarrage du service.

Exemple de configuration :
wrapper.share.1.startup.premapped=SHUTDOWN
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10
Exemple de journal de sortie :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   "S:" is already defined.  Shutting down.
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

Déconnexion du mappage à l'arrêt

Par défaut, le Wrapper laissera tous les partages réseau mappés lorsqu'il s'arrête. C'est généralement le meilleur choix, car les partages peuvent être utilisés par d'autres utilisateurs ou applications.

Exemple de journal de sortie :
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

Parfois, vous pouvez vouloir vous assurer que le lecteur est déconnecté à l'arrêt.

Exemple de configuration :
wrapper.share.1.shutdown.unmap=TRUE
Exemple de journal de sortie :
wrapper  | Unmapped "S:".
wrapper  | <-- Wrapper Stopped

Si le partage n'a pas été mappé par l'instance actuelle du Wrapper, il restera monté.

Exemple de journal de sortie :
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

S'il y a des fichiers ouverts sur le partage, la déconnexion du mappage peut également échouer. La déconnexion du mappage peut être forcée si vous le souhaitez. Notez que le Wrapper laissera tout de même le partage s'il n'a pas été mappé par l'instance actuelle du Wrapper.

Exemple de configuration :
wrapper.share.1.shutdown.unmap=TRUE

Mappage d'une imprimante réseau

Les imprimantes situées sur une machine distante peuvent également être mappées de la même manière qu'un lecteur. La différence est qu'un port d'imprimante est spécifié plutôt qu'une lettre de lecteur :

Exemple de configuration :
wrapper.share.1.location=\\myserver\printer
wrapper.share.1.target=LPT2:
wrapper.share.1.type=PRINTER
Exemple de journal de sortie :
wrapper  | Attempting to map the "\\myserver\printer" share to "LPT2:"...
wrapper  |   Mapped "LPT2:".

Problèmes potentiels

Il existe un certain nombre de problèmes assez courants que vous êtes susceptible de rencontrer lors du mappage de partages réseau.

Serveur introuvable.

Si le serveur est hors service ou s'il y a des problèmes réseau, il est possible que la tentative de connexion échoue.

Exemple de journal d'échec de mappage :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Attempt #1 (The network name cannot be found. (0x43))
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (The network name cannot be found. (0x43))

Si vous ne spécifiez pas explicitement le type de partage comme DISK, Windows ne pourra pas déterminer si vous essayez de vous connecter à un disque ou à une imprimante, et le message d'erreur ressemblera à ceci :

Exemple de journal d'échec de mappage :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (The network resource type is not correct. (0x42))

Accès refusé

Si le compte configuré ou le mot de passe sont incorrects, le mappage échouera avec un message comme le suivant. Veuillez vérifier auprès de votre administrateur système que les informations de connexion sont correctes.

Exemple de journal d'échec de mappage :
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (Access is denied. (0x5))

Débogage

Si le mappage ne fonctionne pas comme prévu, veuillez essayer d'activer la sortie de débogage.

Exemple de configuration :
wrapper.debug=TRUE

La sortie de débogage inclura une confirmation de la configuration et fournira des informations supplémentaires sur ce que le Wrapper essaie de faire.

Exemple de journal d'échec de mappage :
wrapper  | Network Mapping Details:
wrapper  |   Location:         \\myfileserver\commonshare
wrapper  |   Target:           S:
wrapper  |   Account:          domain\user (Password: password)
wrapper  |   Type:             ANY
wrapper  |   Startup:
wrapper  |     On Failure:     CONTINUE
wrapper  |     On Premapped:   CONTINUE
wrapper  |     Max Retries:    5
wrapper  |     Retry Interval: 10
wrapper  |   Shutdown:
wrapper  |     Unmap:          FALSE (Force: FALSE)
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (Access is denied. (0x5))

Référence : Propriétés wrapper.share.<n>.*

Ces propriétés sont utilisées pour configurer le mappage des ressources réseau vers des lecteurs locaux.