Windows macht es möglich, Laufwerke auf Netzwerkservern mit lokalen Festplattennamen zu mounten, so dass auf diese von Nutzern wie auf eine lokale Festplatte zugegriffen werden kann. Dies ist ein sehr leistungsstarkes Feature von Windows, von denen viele Anwendungen Nutzen ziehen können.

Das Problem ist jedoch, dass Windows nicht sehr konsistent ist, wenn es darum geht, wie es mit solchen Laufwerken umgeht, auf die von einem Windows-Dienst aus zugegriffen wird. Wenn der Dienst manuell gestartet wird, werden die Laufwerke verfügbar sein, aber wenn das System neu gestartet wird, wird der Dienst auf die Laufwerke nicht mehr zugreifen können.

Der Java Service Wrapper bietet eine einfache Art und Weise an, um den Dienst mitzuteilen, wie er selbst Netzwerklaufwerke mounten kann, wenn diese nicht verfügbar wären. Das heißt, auf sie kann jederzeit zuverlässig zugegriffen werden.

Lösung

Die Lösung ist, dem Dienst die Fähigkeit zu geben, seine eigenen Laufwerke mounten zu können. Der Java Service Wrapper liefert eine Reihe von Eigenschaften, die es ermöglichen, sowohl Netzwerklaufwerke als auch Drucker zu mounten. Auf diese Weise sind Java-Anwendungen imstande, zuverlässig solche Freigaben zu nutzen, unabhängig davon, wann der Dienst gestartet wurde.

In Windows können Netzwerkfreigaben Laufwerksbuchstaben zugeordnet werden, so dass auf sie wie auf lokale Festplatten zugegriffen werden kann. Viele Anwendungen machen von dieser Fähigkeit Gebrauch, um nahtlos auf Dateien zuzugreifen, die im Netzwerk gemeinsam genutzt werden.

Jedoch, wenn solch eine Anwendung in einen Dienst umgewandelt wird, wird der Zugriff auf Laufwerkfreigaben nicht mehr zuverlässig sein, weil das Mounten möglicherweise nur während der Sitzung des Nutzers getan werden kann. Sie sind in ein paar Fällen verfügbar, aber nicht in anderen. Abhängig davon, wann der Dienst gestartet wurde, und wer zu diesem Zeitpunkt an der Maschine eingeloggt war.

Technische Übersicht

Kompatibel :3.5.0
Editionen :Professional EditionStandard EditionCommunity Edition (Not Supported)
Betriebssysteme :WindowsMac OSX (Not Supported)Linux (Not Supported)IBM AIX (Not Supported)FreeBSD (Not Supported)HP-UX (Not Supported)Solaris (Not Supported)IBM z/Linux (Not Supported)

Es ist möglich, ein Windows-Dienst als ein besonderes Konto auszuführen, jedoch werden die zugeordneten Laufwerke, die mit dem Konto erstellt wurden, nicht verfügbar sein, wenn das System erstmals hochstartet, und werden so nicht mit dem Dienst verfügbar sein. Wenn ein Nutzer sich mit dem gleichen Konto anmeldet, dann werden die Laufwerke installiert, aber sie werden nicht gegenüber dem Dienst verfügbar sein, solange bis das System komplett neu gestartet wurde.

Üblicherweise bedeutete dies, dass es notwendig ist, die UNC (Uniform Naming Convention) zu nutzen, um auf Dateien im Netzwerk zugreifen zu können.

\\myfileserver\commonshare\myfiles\data.txt

Diese UNC-Syntax funktioniert mit einigen Anwendungen, aber sie ist nicht so praktisch oder portabel für freigegebene Laufwerke:

S:\myfiles\data.txt
? Please check the English version for a more recent version of this text.

Viele Anwendungen, die ursprünglich nicht dafür entwickelt wurden, um als ein Windows-Dienst zu laufen, oder auf Netzwerklaufwerke zuzugreifen, stürzen ab, wenn diese einen UNC-Pfad in der Konfigurationsdatei antreffen.

Der Java Service Wrapper erlaubt Diensten, auf gemeinsam benutzte Ressourcen einfach zuzugreifen; einfach durch Verbindung zu Remote-Servern und -Druckern. Es liefert eine Reihe von "share" Konfigurationseigenschaften die der Wrapper-Konfigurationsbeispiel hinzugefügt werden können, um den Wrapper mitzuteilen, ein oder mehrere Netzwerklaufwerke oder Drucker-Mappings einzurichten, bevor die Java-Anwendung gestartet wird.

Einfaches Mounten von öffentlichen Freigaben

Viele Unternehmen besitzen gemeinsam geteilte Freigabelaufwerke, auf die jeder mit Netzwerkzugang, z.B. mit einem Gastkonto, zugreifen kann. Diese sind bei weitem die am einfachsten zu erstellenden Konti, da sie nur einen zugeordneten Standort, und den Laufwerksbuchstaben (das Alphabet zeigt ein Laufwerk an), dem es zugeordnet wird, benötigen.

Konfigurationsbeispiel:
wrapper.share.1.location=\\myfileserver\commonshare
wrapper.share.1.target=S:
wrapper.share.1.type=DISK
Beispiellog - Mounten auf Laufwerk "S":
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  | Mapped "S:".

Nachdem dies installiert ist, ist die Anwendung imstande auf Laufwerk S: auf die gleiche Weise zuzugreifen als ob es ein anderes lokales Laufwerk ist. Dies ist ein sehr einfaches Beispiel, welches keine Anmeldedaten, Verbindungsfehler liefert oder genau sagt, was mit dem zugeordneten Laufwerk zu tun ist, wenn der Dienst beendet wird.

Mounten einer öffentlichen Freigabe mit Authentifizierung

Passwortschutz und beschränkte Kontofreigaben sind für Netzwerklaufwerke üblich. Der Wrapper ermöglicht es, ein besonderes Konto zu bestimmen, um sich damit zu verbinden und optional ein Passwort dem Konto zuzuweisen.

Konfigurationsbeispiel:
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

Wenn das Benutzerkonto, unter dem der Wrapper läuft, Zugang zu dem gemeinsam genutzten Netzwerk hat, dann kann es sein, dass es nicht notwendig ist, ein Konto und Passwort zu bestimmen, auch wenn der Netzwerkzugang beschränkt wurde. Dies ist möglich, weil Windows oft in der Lage ist, die gegenwärtigen Kontoauthentifizierungsinformationen wieder zu benutzen, sobald man sich mit dem gemeinsam genutzten Netzwerk verbindet.

Beispiel Mounten mit dem "S"-Laufwerk:
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  | Mapped "S:".

Windows weist eindeutige Buchstaben den Laufwerken zu, um Ressourcen und Dienste zuzuordnen. Wenn aus einem bestimmten Grund ein Festplattenbuchstabe bereits in Benutzung ist, reagiert der Wrapper automatisch, entweder mit SHUTDOWN oder CONTINUE, um die JVM zu starten und einen unterschiedlichen Netzlaufwerk 'Y:' Buchstaben zuzuweisen.

Standardmässig wird der Wrapper ein paar Male versuchen, sich mit dem Netzwerklaufwerk zu verbinden. Wenn das aufgrund von unbekannten Fehlern oder Ähnlichem nicht möglich wäre, sind folgende Optionen möglich: Unmounten des Laufwerks oder SHUTDOWN. Andererseits stellt der Wrapper sicher, dass es keine offenen Dateien vor der Verbindungstrennung gibt, und setzt dann fort.

Umgang mit Fehler beim Mounten

Wann immer mehr als ein Server oder Netzwerk betroffen ist, besteht die Möglichkeit, dass etwas falsch läuft. Wenn das Problem vorübergehend ist, dann wird der Wrapper standardmäßig bis zu 5 Verbindungsversuche versuchen, bevor er schliesslich fortsetzt.

Beispiellog der Ausgabe:
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))

Aber wenn die Netzwerkfreigabe für den Dienstbetrieb kritisch ist, kann es sein, dass Sie wünschen, dass das Hochfahren des Wrappers nicht funktioniert.

Konfigurationsbeispiel:
wrapper.share.1.startup.failure=SHUTDOWN
Beispiellog von Ausgabe:
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

Es ist möglich zu steuern, wie häufig der Wrapper das Mapping neu versucht, und wie lange zwischen jedem Versuch gewartet wird. Bitte beachten Sie, dass wiederholte Versuche nicht für Probleme unternommen werden, die dauerhaft sind.

Konfigurationsbeispiel:
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10

Umgang mit vorkonfigurierten Freigaben

Es ist für eine Netzlaufwerkfreigabe ziemlich üblich mittels des Wrappers einem Laufwerk zugeordnet wird, das normalerweise von einem eingeloggten Benutzer zugeordnet wird. Wenn dies passiert, ist es möglich, dass der Dienst mit dem bereits zugeordneten Laufwerk gestartet wird.

Beispiellog von Ausgabe:
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   "S:" is already defined.  Trying to continue

Das Problem dabei ist, dass Sie nicht 100% sicher sein können, dass das gemountete Laufwerk dem korrekten Server zugeordnet wurde. Wenn diese Sache ein Problem ist, kann es sein, dass Sie danach wünschen, den Start des Dienstes abzubrechen.

Konfigurationsbeispiel:
wrapper.share.1.startup.premapped=SHUTDOWN
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10
Beispiellog von Ausgabe:
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   "S:" is already defined.  Shutting down.
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

Unmounten beim Herunterfahren

Standardmäßig lässt der Wrapper beim Beenden jedes Netzwerklaufwerk gemountet. Dies ist gewöhnlich die beste Wahl, da die Freigaben von anderen Usern oder Anwendungen genutzt werden können.

Beispiellog von Ausgabe:
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

Manchmal möchten Sie sicherstellen, dass das Laufwerk beim Beenden getrennt wird.

Konfigurationsbeispiel:
wrapper.share.1.shutdown.unmap=TRUE
Beispiellog von Ausgabe:
wrapper  | Unmapped "S:".
wrapper  | <-- Wrapper Stopped
? Please check the English version for a more recent version of this text.

Wenn die Freigabe nicht von der gegenwärtigen Wrapper-Instanz zugeordnet wurde, dann wird diese ignoriert.

Beispiellog von Ausgabe:
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

Wenn es offene Dateien auf der Freigabe gibt, dann kann das Unmounten auch mißlingen. Das Unmounten kann erzwungen werden, wenn es so gewünscht wurde. Beachten Sie, dass der Wrapper die Freigabe unberührt lässt, wenn sie nicht durch die gegenwärtige Wrapper-Instanz zugeordnet wurde.

Konfigurationsbeispiel:
wrapper.share.1.shutdown.unmap=TRUE

Mounten eines Netzwerkdruckers

Drucker, die sich an einer entfernten Maschine befinden, können auch auf die gleiche Weise wie ein Festplattenlaufwerk gemountet werden. Der Unterschied ist, dass eher ein Drucker-Port als ein Laufwerksbuchstabe bestimmt würde:

Konfigurationsbeispiel:
wrapper.share.1.location=\\myserver\printer
wrapper.share.1.target=LPT2:
wrapper.share.1.type=PRINTER
Beispiellog von Ausgabe:
wrapper  | Attempting to map the "\\myserver\printer" share to "LPT2:"...
wrapper  |   Mapped "LPT2:".

Potentielle Probleme

Es gibt eine Anzahl von ziemlich üblichen Problemen, die Sie wahrscheinlich antreffen werden, wenn Sie Netzwerklaufwerksfreigaben mounten.

Server nicht gefunden.

Wenn der Server heruntergefahren ist oder es Netzwerkprobleme gibt, dann ist es möglich, dass der Verbindungsversuch fehlschlagen könnte.

Beispiellog eines Fehlers beim Mounten:
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))

Wenn Sie den Freigabetyp nicht genau als DISK spezifizieren, dann wird Windows nicht genau sagen können, ob Sie sich mit einer Festplatte oder einem Drucker verbinden, und die Fehlermeldung wird wie folgt aussehen:

Beispiellog eines Fehlers beim Mounten:
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))

Zugriff verweigert

Wenn das konfigurierte Konto oder Passwort inkorrekt ist, dann wird das Mounten mit einer Nachricht wie die Folgende fehlschlagen. Bitte überprüfen Sie mit Ihrem Systemadministrator, um sicherzustellen, dass die Verbindungsinformation korrekt ist.

Beispiellog eines Fehlers beim Mounten:
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (Access is denied. (0x5))

Fehlersuche

Wenn das Mounten nicht wie erwartet funktioniert, versuchen Sie bitte die Debug-Ausgabe zu aktivieren.

Konfigurationsbeispiel:
wrapper.debug=TRUE

Die Debug-Ausgabe beinhaltet auch die Bestätigung der Konfiguration sowohl die Bereitstellung zusätzlicher Information über das, was der Wrapper versucht zu tun.

Beispiellog eines Mounting-Fehlers:
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))

Verweis: wrapper.share.<n>.* Eigenschaften

? Please check the English version for a more recent version of this text.
These properties are used to configure the mapping of Network Resources to local drives.