World Map
Java Service Wrapperは、御社Javaアプリケーション製品の安定した信頼性を高める最短最善の方法です。
  • Free Trial
  • Buy Now

問題

JavaサービスからマッピングされたWindows共有にアクセスするには?

Arrow

解決!

Java Service Wrapperには、ネットワークドライブやプリンタをサービスとしてマッピングする機能を備えています。

Windowsではネットワークサーバー上のドライブをローカルドライブレター(ドライブを示すアルファベット)に マッピング(Windows: 『ネットワークドライブの割り当て』)することができます。 これで、ユーザーは外部ネットワークを意識することなく、ローカルドライブと同じような感覚でアクセスすることができます。 これはWindowsのとてもパワフルな機能であり、多くのアプリケーションにとっても利点があります。

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

Java Service Wrapperでは簡単な手法で、 ネットワークドライブが有効になっていないとき、そのドライブをマッピングするように、 サービスへ指示を出します。つまり、いつでも信頼性のあるアクセスが可能になります。

詳細

Windowsでは、ネットワーク共有をドライブレター(ドライブを示すアルファベット)にマッピングできるため、 ローカルドライブと同じような感覚で、アクセスすることが可能です。 ネットワークを超える共有ファイルへシームレスにアクセスできるため、 多くのアプリケーションが、この機能を便利に活用することができます。

しかしながら、アプリケーションがサービスへ転換されると、 マッピングされたドライブへのアクセスの信頼性が失われます。 その理由は、マッピングは潜在的にユーザーの利用セッション中だけに有効だからです。 サービスがいつ開始されるか、誰がマシンにログインしているか、それぞれの状況次第で、 無事に使えるケースもありますが、使えないこともあります。

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

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

\\myfileserver\commonshare\myfiles\data.txt

このUNC形式は、一部のアプリケーションでは動作しますが、マッピングされたドライブとして手軽さがなく便利ではありません。

S:\myfiles\data.txt

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

ソリューション

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

テクニカル概要

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

Java Service Wrapperを活用すると、サーバーやプリンタにリモート接続して、サービスから簡単に共有リソースとしてアクセスできるようになります。 Java Service Wrapperでは、次のような共有関連のコンフィギュレーションプロパティを提供しており、 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  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  | マッピング完了 「S:」

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

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

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

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

ログ出力例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。試み #1 (The network name cannot be found. (0x43))
...
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。 継続を試行中。(The network name cannot be found. (0x43))

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

コンフィギュレーション設定例:
wrapper.share.1.startup.failure=SHUTDOWN
ログ出力例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。 試み #1 (The network name cannot be found. (0x43))
...
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。  シャットダウン中。 (The network name cannot be found. (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  | マッピングされた「S:」を残す。
wrapper  | <-- Wrapperが停止しました

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

コンフィギュレーション設定例:
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 (The network name cannot be found. (0x43))
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。 継続を試行中。 (The network name cannot be found. (0x43))

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

マッピング失敗のログ例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。 継続を試行中。(The network resource type is not correct. (0x42))

アクセス拒否

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

マッピング失敗のログ例:
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。 継続を試行中。(Access is denied. (0x5))

デバッギング

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

コンフィギュレーション設定例:
wrapper.debug=TRUE

デバッグ出力には追加情報の提供を含め、Wrapperの設定情報の内容が含まれています。

マッピング失敗のログ例:
wrapper  | ネットワークマッピング詳細:
wrapper  |   場所:         \\myfileserver\commonshare
wrapper  |   ターゲット:           S:
wrapper  |   アカウント:          domain\user (パスワード: password)
wrapper  |   タイプ:             ANY
wrapper  |   スタートアップ:
wrapper  |     失敗時:     CONTINUE
wrapper  |     プリマップ時:   CONTINUE
wrapper  |     最大再試行回数:    5
wrapper  |     再試行の間隔: 10
wrapper  |   シャットダウン:
wrapper  |     マッピング切断:          FALSE (強制: FALSE)
wrapper  | 共有「\\myfileserver\commonshare」を「S:」へマッピング試行中...
wrapper  |   「S:」マッピングできません。 継続を試行中。 (Access is denied. (0x5))

参照:コンフィギュレーションプロパティ

これらは、サービスを動かすWindowsアカウントを設定するプロパティと組み合わせて利用されます。