Windows では、ネットワークサーバー上のドライブをローカルドライブ文字(ドライブを示すアルファベット)にマッピングすることで、 ユーザーがローカルドライブであるかのようにアクセスできるようにすることが可能です。 これは Windows の非常に強力な機能であり、多くのアプリケーションで利用されています。

しかし、問題は、Windows サービスからアクセスした場合に、 マッピングされたドライブの取り扱いについて Windows に一慣性がないことです。 手動でサービスを開始した時、マッピングされたドライブは使用可能になりますが、 システムを再起動すると、そのサービスはもはやドライブにアクセスできません。

Java Service Wrapper では簡単な手法で、 ネットワークドライブが利用できないとき、そのドライブをマッピングするように、サービスへ指示を出します。 つまり、確実にアクセスできることを意味します。

解決策

解決策としては、サービスに独自のドライブをマッピングする機能を与えることです。 Java Service Wrapper は、起動時にネットワークドライブやプリンターのマッピングを 可能にする柔軟なプロパティセットを提供します。 これにより、サービスの開始タイミングに関わらず、Java アプリケーションが確実にそのような共有を利用することができます。

Windows では、ネットワーク共有をドライブ文字にマッピングすることで、あたかもローカルドライブのようにアクセスすることができます。 多くのアプリケーションは、この機能を利用して、ネットワーク上で共有されているファイルにシームレスにアクセスします。

しかし、アプリケーションをサービス化した場合、マッピングがユーザーのセッション内でしか行われない可能性があるため、 マッピングされたドライブへのアクセスの信頼性が失われます。 サービスがいつ開始されたか、およびその時点で誰がマシンにログインしていたかによって、 利用できる場合と利用できない場合があります。

テクニカル概要

対応バージョン :3.5.0
対応エディション :プロフェッショナル版スタンダード版コミュニティー版 (未対応)
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/Linux (未対応)

Windows サービスを特定のアカウントで実行するように設定することが可能です。 ただし、そのアカウントでマッピング設定したドライブは、システムの最初の起動時には利用できず、 それゆえにサービスからも利用することができません。 もしユーザーが同じアカウントでログインした場合、そのドライブはセットアップされますが、 サービスを完全に再起動しない限り、ドライブは利用できないままです。

従来からの方式で、UNC 形式(Uniform Naming Convention) (マシン名を含むフルパス)を使ってネットワーク上のファイルへアクセスする必要がありました。

\\myfileserver\commonshare\myfiles\data.txt

この UNC 形式は、一部のアプリケーションでは動作しますが、マッピングされたドライブほど便利でポータブルではありません。

S:\myfiles\data.txt

Windows サービスとして動作するように初めから設計されていないアプリケーションや、 ネットワークドライブへアクセスするアプリケーションの多くは、 コンフィギュレーションファイル内で UNC パスに遭遇すると失敗します。

Java Service Wrapper により、サービスが共有リソースに簡単にアクセスできるようになります。 「共有」関連のプロパティのセットだけで、 遠隔地またはプリンターへのマッピングを簡単に設定し、Java アプリケーションを起動する前に、 実行中のアカウントでそれらを使用できるようにすることができます。

パブリック(公共)共有の簡易マッピング

多くの企業や組織には、ゲストアカウントを介してネットワークにアクセスできるすべてのユーザーが使用できる 共通の共有ドライブがあります。 マッピングされるネットワークの場所と、 それをマッピングするドライブ文字(ドライブを示すアルファベット) だけを指定すれば良いので、設定はとても簡単です。

設定例:
wrapper.share.1.location=\\myfileserver\commonshare
wrapper.share.1.target=S:
wrapper.share.1.type=DISK
「S」ドライブへマッピングしたログ例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  | マッピング完了 「S:」。

一旦、これが設定されると、他のローカルドライブと同様の感覚で、「S:」ドライブで共有にアクセスできるようになります。 これは何も認証情報を必要としない非常にシンプルな例で、 接続障害時の取り扱いや、サービスが停止する際にマッピングされたドライブに対しての処理指定などが省略されています。

認証つきパブリック(公共)共有のマッピング

ネットワークドライブはパスワードで保護され、特定のアカウントにのみアクセスが許可されるのが一般的です。 Wrapper では接続する特定アカウントを指定することが可能で、 アカウントのパスワードも任意に設定できます。

設定例:
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

もし、Wrapper を動かしているユーザーアカウントに共有ネットワークへアクセス権があれば、 ネットワークへのアクセスが制限されたとしても、アカウントやパスワードを指定する必要はないかもしれません。 共有ネットワークへ接続する際に、Windows は現在のアカウント認証情報を再利用することがあるため、これが可能です。

「S」ドライブへのマッピングしたログ例:
wrapper  | …
wrapper  | マッピング完了 「S:」。

Windows は、リソースやサービスをマッピングするために、ドライブに固有の文字を割り当てます。 もし何かの理由により、そのドライブ文字が既に利用中である場合、 Wrapper は自動的にシャットダウン(SHUTDOWN)するか、 あるいは JVM 開始を継続(CONTINUE)して、 他のドライブレター「Y」を割り当てます。

デフォルトで、Wrapper はネットワークドライブへの接続を何度も試みます。 不明なエラーなどの理由で現実的に不可能なことはありますが、指定できるオプションとしては、 「ドライブの接続を切断する(UNMAP)」、 あるいは「シャットダウンする(SHUTDOWN)」です。 その一方、切断する前に Wrapper はファイルの開いていないことを確認してから動作を継続します。

マッピング失敗の取り扱い

サーバーやネットワークが絡んでいる場合は、いつでも接続に失敗する可能性はあります。 もし問題が一時的な場合、Wrapper は動作を継続する前に、 デフォルトで5回まで接続を試みます

ログ出力例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」をマッピングできません。試み #1 (ネットワーク名が見つかりません。 (0x43))
...
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |    「S:」をマッピングできません。 継続を試行中。(ネットワーク名が見つかりません。 (0x43))

しかし、もしネットワーク共有がサービスのオペレーション上で重要な場合には、 スタートアップ時にネットワーク接続が確立しない場合には、Wrapper を停止(SHUTDOWN)させたいこともあるでしょう。

設定例:
wrapper.share.1.startup.failure=SHUTDOWN
ログ出力例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」をマッピングできません。 試み #1 (ネットワーク名が見つかりません。 (0x43))
...
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |    「S:」をマッピングできません。  シャットダウン中。  (ネットワーク名が見つかりません。 (0x43))
wrapper  | <-- Wrapper が停止しました

Wrapper が再試行する回数その試行の時間間隔をコントロールすることが可能です。 永久エラーの場合に、再試行は実行されませんのでご留意ください。

設定例:
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10

事前にマッピングされた共有の取り扱い

ログインしているユーザーが通常マッピングしているドライブに、Wrapper によってネットワーク共有がマッピングされることはわりとよくあることです。 このとき、すでにドライブがマッピングされている状態でサービスが開始される可能性があります。

ログ出力例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」は既に定義済み。 継続を試みます

これに伴う問題は、マッピングされたドライブが正しいサーバーなのか100%の確信が持てないことです。 もし、この懸念が問題になる場合、サービスの起動を中止することをお勧めします。

設定例:
wrapper.share.1.startup.premapped=SHUTDOWN
wrapper.share.1.startup.max_retries=2
wrapper.share.1.startup.retry_interval=10
ログ出力例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」は既に定義済み。 シャットダウン中。
wrapper  | マッピングされた「S:」を残す。
wrapper  | <-- Wrapper が停止しました

シャットダウン時のマッピング解除

デフォルトで、Wrapper はシャットダウン時にマッピングされた共有ネットワークをそのまま残します。 他のユーザーやアプリケーションがその共有を利用する可能性もあるため、残すことが通常の最適な選択です。

ログ出力例:
wrapper  | Leave "S:" mapped.
wrapper  | <-- Wrapper Stopped

しかしながら、時には、シャットダウン時にドライブを切断したいと思うこともあるでしょう。

設定例:
wrapper.share.1.shutdown.unmap=TRUE
ログ出力例:
wrapper  | マッピング切断「S:」
wrapper  | <-- Wrapper が停止しました

共有が現在の Wrapper インスタンスによってマッピングされていない場合、その共有はそのまま残されます。

ログ出力例:
wrapper  | マッピングされた「S:」を残す。
wrapper  | <-- Wrapper が停止しました

もし共有上でファイルが開かれている場合、マッピング解除も失敗する可能性があります。 必要に応じて、強制的にマッピング解除を行うことも可能です。 現在の Wrapper インスタンスによってマッピングされていない場合、Wrapper は共有を残したままになりますので、ご留意ください。

設定例:
wrapper.share.1.shutdown.unmap=TRUE

ネットワークプリンターのマッピング

リモートマシン上に配置されているプリンターも、1つのドライブとしての同じように、マッピングすることができます。 違いは、ドライブ文字の代わりに、プリンターポートをターゲットに指定するとういことです。

設定例:
wrapper.share.1.location=\\myserver\printer
wrapper.share.1.target=LPT2:
wrapper.share.1.type=PRINTER
ログ出力例:
wrapper  | 共有「\\myserver\printer」を「LPT2:」へマッピング試行中…
wrapper  |   マッピング完了 「LPT2:」

潜在的な問題

ネットワーク共有をマッピングする際に遭遇する可能性が高い、かなり一般的な問題がいくつかあります。

サーバーが見つからない

もしサーバーがダウンしていたり、ネットワーク問題があると、接続の試みに失敗することがあります。

マッピング失敗のログ例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」マッピングできません。 試み #1 (ネットワーク名が見つかりません。 (0x43))
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |    「S:」をマッピングできません。 継続を試行中。 (ネットワーク名が見つかりません。 (0x43))

もし共有の種類を「DISK」のように具体的に指定しない場合、 接続の試みの対象が「ディスク」なのか「プリンター」なのか Windows は判断できないため、 次のようなエラーメッセージが表示されます。

マッピング失敗のログ例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」をマッピングできません。 継続を試行中。 (ネットワーク共有種類が正しくありません。 (0x42))

アクセス拒否

もし設定されたアカウントパスワードが不正だった場合、 次のようなメッセージでマッピングは失敗することがあります。 システム管理者に正しい接続情報をお尋ねください。

マッピング失敗のログ例:
wrapper  | Attempting to map the "\\myfileserver\commonshare" share to "S:"...
wrapper  |   Unable to map "S:".  Trying to continue. (Access is denied. (0x5))

デバッグ

もし期待どおりにマッピングが動作しない場合、デバッグ出力を有効にして、原因の追究をお薦めします。

設定例:
wrapper.debug=TRUE

デバッグ出力には、コンフィギュレーションの確認だけでなく、Wrapper 動作についての追加情報が含まれます。

マッピング失敗のログ例:
wrapper  | ネットワークマッピング詳細:
wrapper  |   場所:         \\myfileserver\commonshare
wrapper  |   ターゲット:           S:
wrapper  |   アカウント:          domain\user (Password: password)
wrapper  |   タイプ:             ANY
wrapper  |   スタートアップ:
wrapper  |     失敗時:     CONTINUE
wrapper  |     プリマップ時:   CONTINUE
wrapper  |     最大再試行回数:    5
wrapper  |     再試行の間隔: 10
wrapper  |   シャットダウン:
wrapper  |     マッピング解除:          FALSE (強制: FALSE)
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中…
wrapper  |   「S:」をマッピングできません。 継続を試行中。 (アクセスが今日日されました。 (0x5))

参照: wrapper.share.<n>.* プロパティ群

これらのプロパティは、ローカルドライブへのネットワークリソースのマッピングを設定するために使用されます。